V8 sem JIT
O V8 v7.4 agora suporta execução de JavaScript sem alocar memória executável em tempo de execução.
Na sua configuração padrão, o V8 depende muito da capacidade de alocar e modificar memória executável em tempo de execução. Por exemplo, o compilador otimizador TurboFan cria código nativo para funções JavaScript (JS) em tempo de execução, e a maioria das expressões regulares de JS são compiladas em código nativo pelo motor irregexp. Criar memória executável em tempo de execução é parte do que torna o V8 rápido.
Mas em algumas situações pode ser desejável executar o V8 sem alocar memória executável:
- Algumas plataformas (por exemplo, iOS, smart TVs, consoles de jogos) proíbem o acesso de escrita à memória executável para aplicativos sem privilégios, e até agora tem sido impossível usar o V8 nessas plataformas; e
- proibir a escrita em memória executável reduz a superfície de ataque do aplicativo a explorações.
O novo modo sem JIT do V8 é destinado a abordar esses pontos. Quando o V8 é iniciado com a flag --jitless
, ele é executado sem nenhuma alocação de memória executável em tempo de execução.
Como funciona? Essencialmente, o V8 muda para um modo apenas de interpretador com base na nossa tecnologia existente: todo o código de usuário em JS é executado pelo interpretador Ignition, e o padrão de correspondência de expressões regulares também é interpretado. WebAssembly atualmente não é suportado, mas interpretação está dentro das possibilidades. Os builtins do V8 ainda são compilados para código nativo, mas não fazem mais parte da heap gerenciada de JS, graças aos nossos esforços recentes para incorporá-los no binário do V8.
Por fim, estas mudanças nos permitiram criar a heap do V8 sem exigir permissões executáveis para nenhuma de suas regiões de memória.
Resultados
Como o modo sem JIT desativa o compilador otimizador, isso resulta em uma penalidade de desempenho. Analisamos uma variedade de benchmarks para entender melhor como as características de desempenho do V8 mudam. Speedometer 2.0 é destinado a representar um aplicativo web típico; o Web Tooling Benchmark inclui um conjunto de ferramentas comuns para desenvolvedores JS; e também incluímos um benchmark que simula um fluxo de navegação no aplicativo YouTube da sala de estar. Todas as medições foram feitas localmente em um desktop Linux x64 durante 5 execuções.
O Speedometer 2.0 é cerca de 40% mais lento no modo sem JIT. Aproximadamente metade da regressão pode ser atribuída ao compilador otimizador desativado. A outra metade é causada pelo interpretador de expressões regulares, que foi originalmente projetado como um auxílio para depuração, e verá melhorias de desempenho no futuro.
O Web Tooling Benchmark tende a gastar mais tempo em código otimizado pelo TurboFan e, portanto, mostra uma regressão maior de 80% quando o modo sem JIT está ativado.
Finalmente, medimos uma sessão de navegação simulada no aplicativo YouTube da sala de estar, que inclui tanto reprodução de vídeo quanto navegação no menu. Aqui, o modo sem JIT está aproximadamente equivalente e apresenta apenas uma desaceleração de 6% na execução de JS em comparação com uma configuração padrão do V8. Este benchmark demonstra como o desempenho máximo de código otimizado nem sempre está correlacionado com o desempenho do mundo real, e em muitas situações os utilizadores podem manter um desempenho razoável mesmo no modo sem JIT.
O consumo de memória mudou apenas ligeiramente, com uma mediana de 1,7% de diminuição no tamanho da heap do V8 para carregar um conjunto representativo de websites.
Encorajamos os utilizadores em plataformas restritas ou com requisitos especiais de segurança a considerar o novo modo sem JIT do V8, disponível agora no V8 v7.4. Como sempre, perguntas e feedback são bem-vindos no grupo de discussão v8-users.
Perguntas Frequentes
Qual é a diferença entre --jitless
e --no-opt
?
--no-opt
desativa o compilador otimizador TurboFan. --jitless
desativa toda a alocação de memória executável em tempo de execução.