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.
| Medida | Sem cache | Com |
|---|---|---|
| o parse de 269 arquivos | 258,7 ms | 17,9 ms |
dataforge check exercicios | 0,918 s | 0,524 s |
dataforge run de um arquivo de 383 linhas | 131,8 ms | 4,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.
DATAFORGE_SEM_CACHE=1 dataforge run programa.df # desliga, para medirToda 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.