Cache de código
O V8 utiliza compilação em tempo de execução (JIT) para executar código JavaScript. Isso significa que, imediatamente antes de executar um script, ele precisa ser analisado e compilado — o que pode causar uma sobrecarga considerável. Como anunciamos recentemente, o cache de código é uma técnica que reduz essa sobrecarga. Quando um script é compilado pela primeira vez, os dados de cache são gerados e armazenados. Na próxima vez que o V8 precisar compilar o mesmo script, mesmo em uma instância diferente do V8, ele pode usar os dados do cache para recriar o resultado da compilação, em vez de compilar do zero. Como resultado, o script é executado muito mais rapidamente.
O cache de código está disponível desde a versão 4.2 do V8 e não é limitado apenas ao Chrome. Ele é exposto através da API do V8, para que qualquer incorporador do V8 possa se beneficiar. O caso de teste usado para testar este recurso serve como um exemplo de como utilizar esta API.
Quando um script é compilado pelo V8, os dados de cache podem ser gerados para acelerar compilações futuras passando v8::ScriptCompiler::kProduceCodeCache
como uma opção. Se a compilação for bem-sucedida, os dados de cache são anexados ao objeto de origem e podem ser recuperados via v8::ScriptCompiler::Source::GetCachedData
. Eles podem ser persistidos para uso posterior, por exemplo, gravando-os em disco.
Durante compilações subsequentes, os dados de cache produzidos anteriormente podem ser anexados ao objeto de origem e passar v8::ScriptCompiler::kConsumeCodeCache
como uma opção. Desta vez, o código será produzido muito mais rapidamente, pois o V8 ignora a compilação do código e o desserializa a partir dos dados de cache fornecidos.
Produzir dados de cache tem um certo custo computacional e de memória. Por essa razão, o Chrome só gera dados de cache se o mesmo script for visto pelo menos duas vezes em um intervalo de alguns dias. Dessa forma, o Chrome consegue transformar arquivos de script em código executável duas vezes mais rápido, em média, economizando um tempo valioso para os usuários a cada carregamento subsequente de página.