Pular para o conteúdo principal

Lançamento do V8 v6.8

· Leitura de 4 minutos
a equipe do V8

A cada seis semanas, criamos um novo branch do V8 como parte do nosso processo de lançamento. Cada versão é derivada do repositório Git mestre do V8 imediatamente antes de um marco Beta do Chrome. Hoje temos o prazer de anunciar nosso mais novo branch, V8 versão 6.8, que está em beta até seu lançamento em conjunto com o Chrome 68 Stable dentro de algumas semanas. O V8 v6.8 está repleto de recursos que beneficiam os desenvolvedores. Este post oferece uma prévia de alguns dos destaques em antecipação ao lançamento.

Memória​

Funções JavaScript mantinham desnecessariamente vivas as funções externas e seus metadados (conhecidos como SharedFunctionInfo ou SFI). Especialmente em códigos intensivos em funções que dependem de IIFEs de curta duração, isso poderia levar a vazamentos de memória. Antes dessa mudança, um Context ativo (ou seja, uma representação na pilha de ativação de uma função) mantinha o SFI vivo da função que criou o contexto:

Ao permitir que o Context aponte para um objeto ScopeInfo, que contém as informações mínimas necessárias para depuração, podemos quebrar a dependência do SFI.

Já observamos melhorias de 3% na memória do V8 em dispositivos móveis em um conjunto das 10 principais páginas.

Paralelamente, reduzimos o consumo de memória dos próprios SFIs, removendo campos desnecessários ou comprimindo-os sempre que possível, e diminuímos seu tamanho em ~25%, com mais reduções previstas em versões futuras. Observamos que os SFIs ocupam de 2% a 6% da memória do V8 em sites típicos, mesmo após serem desconectados do contexto, portanto, você deve notar melhorias de memória em códigos com um grande número de funções.

Desempenho​

Melhorias no desembrulhamento de arrays​

O compilador otimizador não gerava código ideal para desembrulhamento de arrays. Por exemplo, trocar variáveis usando [a, b] = [b, a] costumava ser duas vezes mais lento que const tmp = a; a = b; b = tmp. Após desbloquear a análise de escape para eliminar todas as alocações temporárias, o desembrulhamento de arrays com um array temporário é tão rápido quanto uma sequência de atribuições.

Melhorias em Object.assign​

Até agora Object.assign tinha um caminho rápido implementado em C++. Isso significava que a fronteira entre JavaScript e C++ tinha que ser cruzada para cada chamada de Object.assign. Uma maneira óbvia de melhorar o desempenho embutido era implementar um caminho rápido no lado do JavaScript. Tínhamos duas opções: implementá-lo como um recurso embutido em JS nativo (o que viria com alguma sobrecarga desnecessária nesse caso) ou implementá-lo usando a tecnologia CodeStubAssembler (que oferece mais flexibilidade). Optamos pela última solução. A nova implementação de Object.assign melhora a pontuação de Speedometer2/React-Redux em cerca de 15%, aumentando a pontuação total do Speedometer 2 em 1,5%.

Melhorias em TypedArray.prototype.sort​

TypedArray.prototype.sort possui dois caminhos: um caminho rápido, usado quando o usuário não fornece uma função de comparação, e um caminho lento para todos os outros casos. Até agora, o caminho lento reutilizava a implementação de Array.prototype.sort, que fazia muito mais do que era necessário para ordenar TypedArrays. O V8 v6.8 substitui o caminho lento por uma implementação no CodeStubAssembler. (Não diretamente CodeStubAssembler, mas uma linguagem específica de domínio construída sobre CodeStubAssembler).

O desempenho para ordenar TypedArrays sem uma função de comparação permanece o mesmo, enquanto há um aumento de até 2,5× na velocidade ao ordenar usando uma função de comparação.

WebAssembly​

No V8 v6.8 você pode começar a usar verificação de limites baseada em traps em plataformas Linux x64. Essa otimização de gerenciamento de memória melhora consideravelmente a velocidade de execução do WebAssembly. Já está sendo utilizado no Chrome 68, e no futuro mais plataformas serão suportadas gradualmente.

API V8​

Por favor, use git log branch-heads/6.7..branch-heads/6.8 include/v8.h para obter uma lista das mudanças na API.

Os desenvolvedores com um checkout ativo do V8 podem usar git checkout -b 6.8 -t branch-heads/6.8 para experimentar os novos recursos no V8 v6.8. Alternativamente, você pode assinar o canal Beta do Chrome e experimentar os novos recursos em breve.