apresentando o Jetstream Benchmark Suite

hoje estamos introduzindo um novo WebKit JavaScript benchmark test suite, JetStream. O JetStream codifica o que nosso processo de fato tem sido-combinar benchmarks de latência e taxa de transferência com ponderação aproximadamente igual e capturar métricas de estilos de programação JavaScript tradicionais, bem como novas tecnologias baseadas em JavaScript que capturaram nossa imaginação. As pontuações no JetStream são um bom indicador do desempenho que os usuários veriam em aplicativos da web avançados, como jogos.

otimizar o desempenho do nosso mecanismo JavaScript é uma alta prioridade para o projeto WebKit. Exemplos de algumas das melhorias que introduzimos no ano passado incluem compilação simultânea, GC geracional e o FTL JIT. A engenharia de tais melhorias requer foco: tentamos priorizar projetos de alto impacto em vez de construir e manter otimizações complexas que tenham benefícios menores. Assim, motivamos o trabalho de desempenho com benchmarks que ilustram os tipos de cargas de trabalho que os usuários do WebKit provavelmente encontrarão. Essa filosofia de desenvolvimento orientado a benchmark faz parte do WebKit há muito tempo.

o estado anterior de Benchmarking JavaScript

à medida que fizemos melhorias no mecanismo JavaScript do WebKit, descobrimos que nenhum conjunto de benchmark único era inteiramente representativo dos cenários que queríamos melhorar. Gostamos que o JSBench Meça o desempenho do código JavaScript em sites populares, mas o WebKit já se sai muito bem neste benchmark. Gostamos do SunSpider por sua cobertura de construções de linguagem comumente usadas e pelo fato de que seu tempo de execução é representativo do tempo de execução do código na web, mas fica aquém de medir a taxa de transferência de pico. Gostamos do Octane, mas ele se inclina muito na outra direção: é útil para determinar a taxa de transferência máxima do nosso mecanismo, mas não é sensível o suficiente para o desempenho que você provavelmente verá em cargas de trabalho típicas da web. Ele também minimiza novas tecnologias JavaScript como o asm.js; apenas um dos 15 benchmarks de Octane foi um asm.teste js, e este teste ignora o desempenho do ponto flutuante.

encontrar um bom asm.benchmarks js é difícil. Mesmo que o emscripten esteja ganhando mindshare, seus testes são de longa duração e, até recentemente, careciam de um web harness. Então construímos nosso próprio asm.benchmarks js usando testes do conjunto de testes LLVM. Esses testes C E C++ são usados por desenvolvedores LLVM para rastrear melhorias de desempenho da pilha do compilador clang/LLVM. O próprio EMSCRIPTEN usa LLVM para gerar código JavaScript. Isso torna o conjunto de testes LLVM particularmente apropriado para testar o quão bem um mecanismo JavaScript lida com o código nativo. Outro benefício de nossos novos testes é que eles são muito mais rápidos de executar do que o conjunto de testes emscripten.

ter bons benchmarks JavaScript nos permite buscar com confiança melhorias ambiciosas no WebKit. Por exemplo, SunSpider guiou nosso trabalho de compilação simultânea, enquanto o asm.os testes js e os testes de throughput da Octane motivaram nosso trabalho no FTL JIT. Mas permitir que nossos testes sejam baseados em uma mistura dessas diferentes suítes de benchmark tornou-se impraticável. É difícil dizer aos colaboradores o que eles deveriam estar testando se não houver um conjunto de testes unificado que possa dizer a eles se sua alteração teve o efeito desejado no desempenho. Queremos um conjunto de testes que possa relatar uma pontuação no final, e queremos que essa pontuação seja representativa da direção futura do WebKit.

projetar o novo Jetstream Benchmark Suite

diferentes componentes do WebKit requerem abordagens diferentes para medir o desempenho. Por exemplo, para o desempenho DOM, acabamos de introduzir o benchmark do velocímetro. Em alguns casos, a abordagem óbvia funciona muito bem: por exemplo, muitas otimizações de layout e renderização podem ser conduzidas medindo o tempo de carregamento da página em páginas da web representativas. Mas medir o desempenho de uma implementação de linguagem de programação requer mais sutileza. Queremos aumentar a sensibilidade dos benchmarks às melhorias do Motor Principal, mas não tanto para que percamos a perspectiva de como essas melhorias do motor funcionam em sites reais. Queremos minimizar as oportunidades para o ruído do sistema eliminar nossas medições, mas sempre que uma carga de trabalho é inerentemente propensa ao ruído, queremos uma referência para mostrar isso. Queremos que nossos benchmarks representem uma aproximação de alta fidelidade das cargas de trabalho com as quais os usuários do WebKit provavelmente se importarão.JetStream combina uma variedade de benchmarks JavaScript, cobrindo uma variedade de cargas de trabalho avançadas e técnicas de programação, e relata uma única pontuação que os equilibra usando uma média geométrica. Cada teste é executado três vezes e as pontuações são relatadas com intervalos de confiança de 95%. Cada benchmark mede uma carga de trabalho distinta e nenhuma técnica de otimização única é suficiente para acelerar todos os benchmarks. Alguns benchmarks demonstram compensações, e a otimização agressiva ou especializada para um benchmark pode tornar outro benchmark mais lento. Demonstrar trade-offs é crucial para o nosso trabalho. Conforme discutido em meu post anterior sobre nosso novo compilador JIT, o WebKit tenta se adaptar dinamicamente à carga de trabalho usando diferentes níveis de execução. Mas isso nunca é perfeito. Por exemplo, enquanto nosso novo compilador FTL JIT nos dá velocidades fantásticas em testes de taxa de transferência de pico, isso causa pequenas regressões em alguns testes de ramp-up. Novas otimizações para tempos de execução avançados de idiomas geralmente se deparam com esses trade-offs, e nosso objetivo com a JetStream é ter um benchmark que nos informe sobre os trade-offs que estamos fazendo.

JetStream inclui benchmarks do SunSpider 1.0.2 e Octane 2 JavaScript benchmark suites. Ele também inclui benchmarks do projeto de código aberto do compilador LLVM, compilado para JavaScript usando EMSCRIPTEN 1.13. Ele também inclui um benchmark baseado no HashMap do projeto de código aberto Apache Harmony, traduzido manualmente para JavaScript. Mais informações sobre os benchmarks incluídos no JetStream estão disponíveis na página JetStream em profundidade.

estamos entusiasmados por apresentar este novo benchmark. Para executá-lo, basta visitar browserbench.org/JetStream. você pode arquivar bugs contra o benchmark usando o sistema de gerenciamento de bugs do WebKit no componente Ferramentas / testes.

Deixe uma resposta

O seu endereço de email não será publicado.