A inicialização do DevTools agora está cerca de 13% mais rápida 🎉 (de 11,2s para 10s)
Texto longo, leia o resumo: o resultado é alcançado com a remoção de uma serialização redundante.
Informações gerais
Enquanto o DevTools está inicializando, ele precisa fazer algumas chamadas ao mecanismo JavaScript V8.
O mecanismo que o Chromium usa para enviar comandos do DevTools para o V8 (e para a IPC em geral) é chamado de mojo
. Meus colegas de equipe Benedikt Meurer e Sigurd Schneider descobriram uma ineficiência ao trabalhar em outra tarefa e tiveram uma ideia para melhorar o processo, removendo duas etapas redundantes na forma como essas mensagens são enviadas e recebidas.
Vamos nos aprofundar em como o mecanismo mojo
funciona.
Os mecanismos mojo
Há o comando mojo EvaluateScript
, que executa o comando JS. Ele serializa todo o comando JS, incluindo o arguments
em uma string de código-fonte JavaScript que pode ser eval()
. Como você pode imaginar, essas strings podem se tornar muito longas e caras. Depois que o comando é recebido pelo V8, essas strings de código JavaScript são desserializadas antes da execução. Esse processo de serialização e desserialização de cada mensagem cria uma sobrecarga significativa.
Benedikt Meurer percebeu que a serialização e a desserialização do arguments
são muito caras e que todas as etapas "Serialize JS command to JS string" e "Deserialize JS string" são redundantes e podem ser ignoradas.
Detalhes técnicos: RenderFrameHostImpl::ExecuteJavaScript
Como melhoramos
Lançamos outro método da API mojo que permite transmitir diretamente o nome do objeto, o método a ser chamado e a lista de argumentos, em vez de criar a string do código-fonte JavaScript. Isso nos permite pular a serialização e desserialização, e elimina a necessidade de analisar o código JavaScript.
Para obter detalhes técnicos sobre como implementamos essa otimização, consulte estes dois patches:
- CL 2431864: [ DevTools] Redução da sobrecarga de desempenho do envio de mensagens no front-end
- CL 2442012: [ DevTools] Use
ExecuteJavaScriptMethod
no DevTools (em inglês)
Impacto
Para medir a eficácia da mudança, fizemos algumas medições comparando as revisões cb971089a058 e 4f213b39d581 do Chromium (antes e depois da mudança).
Em ambas as revisões, executamos o seguinte cenário cinco vezes:
- Registrar rastros usando
chrome://tracing
- Abrir DevTools-on-DevTools
- Conseguir o rastreamento
CrRendererMain
registrado e comparar as métricas específicas do V8.
Com base nesses experimentos, o DevTools abre aproximadamente 13% mais rápido (de 11,2s para 10s) com a otimização.
Destaques, durações da CPU
Nome do método | Não otimizada (ms) | Otimizado (ms) | Diferenças (ms) | Melhoria da velocidade (%) |
Total | 11,213.19 | 9.953,99 | -1.259,20 | 12,65% |
v8.run | 499,67 | 3.61 | -496.06 | 12,65% |
V8.Execute | 1,654.87 | 1.349,61 | -305.25 | 3.07% |
v8.callFunction | 1,171.84 | 1,339.77 | 167.94 | -1.69% |
v8.compile | 133.93 | 3.56 | -130.37 | 1.31% |
Tabela de comparação completa de métricas de rastreamento
Como resultado, o DevTools é aberto e funciona mais rápido com menos uso da CPU. 🎉
Fazer o download dos canais de visualização
Use o Chrome Canary, Dev ou Beta como navegador de desenvolvimento padrão. Esses canais de pré-visualização dão acesso aos recursos mais recentes do DevTools, testam as APIs de plataforma da Web modernas e encontram problemas no seu site antes que os usuários o encontrem.
Entrar em contato com a equipe do Chrome DevTools
Use as opções abaixo para discutir os novos recursos e mudanças na postagem ou qualquer outro assunto relacionado ao DevTools.
- Envie uma sugestão ou feedback em crbug.com.
- Informe um problema do DevTools em Mais opções > Ajuda > Informar problemas no DevTools.
- Publique no Twitter em @ChromeDevTools.
- Deixe comentários nos vídeos do YouTube sobre o que há de novo ou nos vídeos do YouTube de dicas sobre o DevTools.