O grande confronto entre navegadores JavaScript

Em O dia em que o desempenho deixou de ser importante, descobri que o desempenho do JavaScript melhorou cem vezes entre 1996 e 2006. Se a Web 2.0 foi construída sobre uma espinha dorsal de JavaScript, isso só é possível, em grande parte, por causa desses cruciais Melhorias de desempenho da Lei de Moore.

Mas será que atingimos um limite de desempenho? É possível que os navegadores executem o JavaScript de forma significativamente mais rápida do que fazem hoje? Sempre achei que a otimização just-in-time (ou mesmo a compilação) do JavaScript era uma fronteira inexplorada na tecnologia de navegadores. E agora o cenário mudou:

  1. Equipe do WebKit da Apple acaba de anunciar um novo e excelente benchmark de JavaScript, o SunSpider.
  2. O mercado de navegadores é mais competitivo do que nunca nos últimos anos, com Opera 9.5, Firefox 3, Safari 3 e IE 8 disputando a cobiçada posição de navegador padrão.

Talvez as equipes de navegadores comecem a considerar o desempenho do JavaScript uma vantagem competitiva. O última vez procurei benchmarks comuns de JavaScript, fiquei profundamente desapontado. É por isso que estou particularmente animado com o o benchmark SunSpider: é notavelmente bem planejado, fácil de executar e abrangente.

É baseado em código real que faz coisas interessantes; tanto coisas que os aplicativos Web de hoje estão fazendo quanto códigos mais avançados do tipo que podemos esperar à medida que os aplicativos Web se tornam mais avançados. Pouquíssimos testes poderiam ser classificados como microbenchmarks.

É equilibrado entre os diferentes aspectos da linguagem JavaScript — e não dominados por apenas um pequeno punhado de aspectos diferentes. Na verdade, coletamos casos de teste de toda a Web, inclusive de outros benchmarks. Mas, ao mesmo tempo, evitamos os testes DOM e nos restringimos ao núcleo da própria linguagem JavaScript.

É super fácil de executar no navegador ou a partir da linha de comando, para que o senhor possa testar o desempenho puro do mecanismo e os resultados que realmente obtém no navegador.

Incluímos análise estatística para que o senhor possa ver a estabilidade dos resultados que está obtendo.

Maciej Stachowiak, membro da equipe do WebKit da Apple, explicou gentilmente o que cada subseção dos benchmarks faz nos comentários:

3d Cálculos puros em JavaScript do tipo que o senhor pode usar para fazer renderização em 3D, mas sem a renderização. Isso acaba afetando principalmente a matemática de ponto flutuante e o acesso a matrizes.
acesso Matriz, propriedade de objeto e acesso a variáveis.
bitops Operações bit a bit, que podem ser úteis para várias coisas, inclusive jogos, cálculos matemáticos e vários tipos de codificação/decodificação. É também o único tipo de matemática em JavaScript que é feito como inteiro, não como ponto flutuante.
fluxo de controle Construções de fluxo de controle (looping, recursão, condicionais). No momento, abrange principalmente a recursão, já que as outras são muito bem cobertas por outros testes.
criptografia Código de criptografia real, que abrange principalmente operações bit a bit e operações com strings.
data Desempenho dos objetos “date” do JavaScript.
matemática Vários cálculos de tipo matemático.
regexp Expressões regulares. Bastante autoexplicativo.
string Processamento de strings, incluindo código para gerar uma “tagcloud” gigante, extração de código JS compactado etc.

SunSpider é o melhor benchmark de JavaScript que já vi, algo de que precisamos desesperadamente em uma era em que o O JavaScript é a língua franca da Web. Na verdade, fiquei tão empolgado que fiz alguns benchmarks rápidos para comparar os quatro principais participantes do mercado de navegadores:

  • Windows Vista 32-bit
  • 4 GB DE RAM
  • CPU Core 2 Duo dual-core de 3,0 GHz
  • todas as extensões de navegador desativadas (instalação limpa)

Gráfico de desempenho do JavaScript do navegador, totais de resultados por navegador

O que me surpreendeu aqui é que o Firefox é substancialmente mais lento que o IE, uma vez que o senhor considera que o resultado anômalo da string. Tive que usar uma versão beta do Opera para obter resultados diferentes de inválidos (NaN) para esse benchmark, o que coincidentemente resume minha opinião sobre o Opera. Ótimo quando funciona! Eu esperava que o Opera se saísse bem; ele estava vencendo com folga os benchmarks de JavaScript em 2005. O Safari, o novo garoto do pedaço, mostra-se extremamente bem, especialmente considerando que está sendo executado fora do ambiente nativo do OS X. Parabéns à Apple. Bem, com exceção do aquela coisa toda da fonte.

Se o senhor estiver curioso para saber como cada navegador se saiu em cada área de benchmark, também analisei isso:

Gráfico de desempenho do JavaScript do navegador, detalhado por área de teste

Se o senhor precisar de mais detalhes, incluindo variações, pode baixar meu conjunto completo de resultados do SunSpider 0.9 como um arquivo de texto.

Se eu aprendi alguma coisa com o setor de informática, é que a concorrência beneficia a todos. Esperamos que o senhor um grande confronto de desempenho do navegador JavaScript estimula as equipes de navegadores a melhorar o desempenho nessa área cada vez mais crucial.