Pular para o conteúdo

O cache de árvores

A árvore guardada entre execuções: 93% do parse — e a chave que impede de rodar a árvore de outro arquivo.

Ler e analisar sintaticamente um arquivo custa tempo toda vez que ele roda. O cache guarda a árvore — e não código compilado, que não atravessa processo — e a devolve enquanto o arquivo não muda.

MedidaSem cacheCom
o parse de 269 arquivos258,7 ms17,9 ms
dataforge check exercicios0,918 s0,524 s
dataforge run de um arquivo de 383 linhas131,8 ms4,4% menos

A terceira linha é a honesta: num arquivo só, a maior parte do tempo é o import do próprio Python. O cache vale onde há muitos arquivos — o check de um projeto, a suíte de testes.

A chave#

Um cache que devolve a árvore errada é pior que nenhum: o programa roda, e roda outra coisa. A chave carrega o caminho, o instante de modificação em nanossegundos, o tamanho, a versão da linguagem, e um resumo do próprio lexer e parser — mexer no parser sem subir a versão não pode deixar árvores velhas valendo.

bash
DATAFORGE_SEM_CACHE=1 dataforge run programa.df     # desliga, para medir

Toda falha do cache cai no caminho normal, e a gravação é feita ao lado e trocada de uma vez: um processo interrompido não deixa arquivo pela metade.