Front End

30 ago, 2011

30 dicas para melhorar o desempenho do JavaScript

Publicidade

O Javascript é uma tecnologia
maravilhosa – mas complicada – que enriquece os sites, mas que frequentemente
pode ser um obstáculo para sua operação eficiente, com prejuízo 
para a experiência do usuário.

Melhorar a experiência do usuário – seja ele um consumidor
ou um administrador de sistema – é nossa missão no Monitis. Por quê? Porque foi provado que uma
experiência otimizada do usuário final melhora as taxas de conversão, os
rankings do Google Search e as taxas de satisfação do visitante da web. O que
isso significa? Melhores negócios para você e para sua empresa!

Naturalmente, há muitas formas de
melhorar sua vivência na computação, por exemplo checando o desempenho do
carregamento de páginas na web. Administradores de websites podem usar o teste de carregamento de página do Monitis ou usar o contínuo navegador para monitoramento de toda a página. O
carregamento de páginas é afetado por muitos fatores, incluindo velocidade da
internet, locação de hospedagem, desempenho do servidor e do aplicativo, design e
otimização do site. Apresentamos abaixo as dicas para desempenho do
JavaScript. Novamente, elas podem ajudar webmasters e webdevelopers na criação
de websites rápidos e fornecer uma experiência de primeira categoria ao
usuário.

Dica
#1 – Avalie variáveis locais

(http://blogs.msdn.com/b/ie/archive/2006/08/28/728654.aspx)

Em princípio, específico para IE, porque variáveis locais na
maioria das vezes são encontradas baseadas no escopo do mais específico para o
menos específico, podendo passar por níveis múltiplos de escopo, e os look-ups
podem resultar em queries genéricas. Na definição da função do escopo em uma variável
local sem uma declaração var precedente, é importante que cada variável seja
antecedida por var, de forma a definir o escopo corrente, para impedir o look-up e acelerar o código.

Dica
#2 – Crie códigos de atalho para acelerar a codificação

(http://www.spoonfeddesign.com/4-easytipstoimprovejavascriptefficiency)

Para códigos úteis de uso constante, a aceleração do
processo de codificação pode ser obtida criando atalhos para códigos mais
longos, por exemplo, document.getElementById. Criando atalhos, scripts mais
longos não demorarão tanto para codificar, e economizarão tempo no processo
como um todo.

Dica
#3 – Manipule fragmentos de elementos antes de incorporá-los ao DOM

(http://www.jquery4u.com/dommodification/improvejavascriptperformance)

Antes de colocar elementos no DOM, certifique-se de que todos
os ajustes foram feitos para aumentar o desempenho do JavaScript. Isso
eliminará a necessidade de deixar de lado as APIs Prepend ou Append jQuery APIs.

Dica
#4 – Economize bytes usando Minification

(http://sixrevisions.com/webdevelopment/10-waystoimproveyourwebpageperformance)

Reduza o tamanho dos arquivos de seus documentos JavaScript
removendo caracteres (abas, código-fonte, documentos, espaços etc) sem mudar a
funcionalidade do arquivo.

Há algumas ferramentas de Minification que podem ajudar
nesse processo, com a possibilidade de
reversão. Minification é o processo de
remoção de todos os caracteres desnecessários do código-fonte, sem mudar sua
funcionalidade.

Dica
#5 – Não use loops aninhados se não forem necessários

(http://www.techstrut.com/2009/08/04/10-javascriptperformancetips)

Evite loops indesejáveis, tais como for/while, de forma a
manter a linearidade do JavaScript e impedir que se tenha que passar por milhares de objetos. Loops
indesejados podem fazer o browser trabalhar mais arduamente para processar os
códigos e podem retardar o processo.

Dica
#6 – Faça cache de objectos para aumentar o desempenho

 (http://www.techstrut.com/2009/08/04/10-javascriptperformancetips)

Muitas vezes scripts são repetidamente usados para acessar
certo objeto. Armazenando um objeto muito acessado em uma variável, e usando uma variável em referências subsequentes a esse objeto, um
aumento do desempenho pode ser obtido imediatamente.

Dica
#7 – Use um arquivo .js para cache de scripts

(http://www.javascriptkit.com/javatutors/efficientjs.shtml)

O uso desta técnica permite um melhor desempenho, por permitir
ao browser carregar o script  uma vez, e
somente voltar a chamá-lo do cache caso a página seja recarregada ou revisitada.

Dica
#8 – Coloque o JavaScript no final da página

(http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5)

Incluir os scripts o
mais próximo possível do final da página irá aumentar a velocidade de
renderização e melhorar o paralelismo de download. O resultado é que a página parecerá carregar mais rápido, e em alguns
casos pode economizar no total de código necessário.

Dica #9 – Use o jQuery como framework

(http://www.techstrut.com/2009/08/04/10-javascriptperformancetips)

Usado no scripting do HTML, o jQuery é uma facilidade na
utilização da biblioteca JavaScript que pode ajudar a aumentar a velocidade de
qualquer website. O jQuery  fornece um
grande número de plug-ins que podem ser usados rapidamente, mesmo por
programadores iniciantes.

Dica
#10 – Comprima seus arquivos com GZip

(http://devmoose.com/coding/10-waystoinstantlyspeedupyourwebsite)

O GZip pode reduzir o arquivo JavaScript consideravelmente,
economizando largura de banda e acelerando o tempo de resposta. Os arquivos
JavaScript podem ser muito grandes e, sem compressão, podem derrubar qualquer
website. Arquivos menores proporcionam uma experiência na web mais rápida e
mais satisfatória.

Dica #11 – Não use a palavra-chave “With”

(http://blogs.msdn.com/b/ie/archive/2006/08/28/728654.aspx)

A palavra-chave “With” é considerada uma ovelha negra por ter
diversas falhas que podem ser bem frustrantes. Embora simplifique o trabalho
com propriedades locais  mais simples, a “With” pode fazer a procura por variáveis em outros escopos
mais custosas.

Dica
#12 – Minimize solicitações ao HTTP

(http://www.websiteoptimization.com/speed/tweak/http)

Minimize
solicitações HTTP para processar páginas, combinando arquivos externos e
incluindo o JavaScript diretamente nas páginas XHTML. Cada vez que um único
HTTP acessa o servidor, o resultado é um grande número de atrasos.

Dica #13 – Implemente disparo de eventos

(http://www.djavaweb.com/blog/75-speedupyourwebdevelopsmarteventhandlers.html)

Com disparo de eventos, fica mais fácil usar um único handler de eventos para gerenciar um tipo de evento para toda a página. Sem o uso do disparo de eventos, grandes aplicativos da web podem travar por causa de muitos handlers de eventos. Os benefícios do disparo de eventos incluem: menos funcionalidades para
gerenciar, menores ligações entre código e DOM e menos memória necessária ao
processamento.

Dica
#14 – Não use o mesmo script duas vezes

(http://www.abhishekbharadwaj.com/2010/12/speedupyourwebsiteavoidduplicatescripts)

A
duplicação de scripts terá um impacto significativo no desempenho. Criará
solicitações desnecessárias ao HTTP, especialmente no browser IE. O uso de uma
tag SCRIPT em uma página HTML ajudará a evitar a duplicação acidental de
scripts.

Dica #15 – Remova Double Dollar $

(http://www.mellowmorning.com/2008/05/18/javascriptoptimizationhighperformancejsapps)

O uso da função
“double dollar $” não é necessariamente útil no aumento da velocidade de um
website.

Dica #16 – Criando referências variáveis

(http://mondaybynoon.com/2009/04/27/acoupleofquicktipsforjavascriptoptimization)

Ao trabalhar com um nó específico repetidamente, o melhor
é definir a variável com esse nó em particular, em vez de ficar voltando a
ele frequentemente. Essa não é uma melhoria significativa, mas pode vir a ser,
quando em grande escala.

Dica
#17 – Aumente a velocidade da identificação de objetos

(http://dean.edwards.name/weblog/2005/12/jstip1)

Um método mais eficiente de usar identificação de objetos é usar um
código criado dinamicamente baseado fora da identificação de objetos, em vez de
executar a identificação de objetos dentro de uma função.

Dica
#18 –
Escreva Loops eficazes

(http://robertnyman.com/2008/04/11/javascriptloopperformance)

Dependendo do browser, o método usado para escrever Loops
pode ter grande impacto no desempenho de um site. A escrita imprópria de loops
pode fazer com que páginas fiquem lentas, com muitas queries e execução de
loops em paralelo.

Dica #19 – Diminua cadeias de escopo

(http://homepage.mac.com/rue/JS_Optimization_Techniques)

Escopos globais podem ser lentos, porque sempre que uma função
é executada, um escopo de invocação temporário é criado. O JavaScript pesquisa o
primeiro item na cadeia de escopo e, se não encontrar a variável, percorre toda a
cadeia até encontrar o global object.      

Dica
#20 – Acesse índices em NodeLists

(http://homepage.mac.com/rue/JS_Optimization_Techniques)

NodeLists são vivas e podem ocupar um monte de
memória, já que são atualizados quando um documento subjacente muda. É mais rápido indexar
diretamente em uma lista, se o browser não precisar criar um objeto node list.

Dica #21 – Não use ‘eval’

(http://www.javascripttoolbox.com/bestpractices/#eval)

Embora a função “eval” seja um bom método para executar um
código arbitrário, cada string que tenha passado pela função eval tem que ser
analisada e executada na hora. Esse encargo tem que ser pago toda vez que a
execução chega a um eval evocado.

Dica #22 – Utilize funções inline

(http://portal.acm.org/citation.cfm?id=844097)

A Function Inlining ajuda na eliminação dos custos de uma
call, e substitui  uma função call pelo
corpo da função chamada. Em JavaScript, a execução de uma function call é uma
operação de alto custo por necessitar de diversos passos preparatórios para ser
executada: alocar espaço para
parâmetros, copiar os parâmetros, e decidir o nome da função.

Dica #23 – Implemente Common
Sub-expression Elimination (CSE)

(http://sunilkumarn.wordpress.com/2010/10/19/commonsubexpressioneliminationcse)

A CSE (Common sub-expression
elimination) é uma técnica de otimização do compilador voltada para o desempenho,
que pesquisa expressões idênticas,
substituindo-as por uma única variável que retém o valor computado.
Você pode esperar que o uso de uma única variável local para uma common
sub-expression será sempre mais rápido
do que não mudar o código.

Dica
#24 – Construa o nó DOM e todos seus
sub-nós offline

(http://archive.devwebpro.com/devwebpro-39-0030514OptimizingJavaScriptforExecutionSpeed.html)

Na adição de conteúdo complexo a um
site, como tabelas, o desempenho é melhorado adicionando sub-árvores complexas
offline.

Dica
#25 – Tente não usar variáveis globais

(http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices#JavaScript_Performace_Best_Practices)

Uma vez que o mecanismo de script pesquisar
o escopo ao referenciar as variáveis globais de dentro de uma função ou de
outro escopo, a variável será destruída quando o escopo local for perdido. Se
as variáveis no escopo global não puderem persistir enquanto durar o script, o
desempenho será melhorado.

Dica #26 – Use operações primitivas em vez de invocar funções

(http://wiki.forum.nokia.com/index.php/JavaScript_Performance_Best_Practices#JavaScript_Performace_Best_Practices)

Maior rapidez pode ser obtida na
performance de oops e funções críticas usando primitive functions equivalentes
ao invés de function calls.

Dica
#27 –
Não mantenha referências a outros documentos

(http://dev.opera.com/articles/view/efficientjavascript/?page=4#docreferences)

Não reter referências a outros documentos depois que o script as processou aumenta o
desempenho. Isso porque quaisquer
referências a objetos desses documentos não devem ser mantidas em suas árvores DOM, e o ambiente do script não será mantido
na memória. Dessa forma, o próprio documento não é mais carregado.

Dica #28 – Use XMLHttpRequest

(http://dev.opera.com/articles/view/efficientjavascript/?page=4#docreferences)

O XMLHttpRequest ajuda na redução de
conteúdo proveniente do servidor, e evita o impacto no desempenho devido à
destruição e à recriação do ambiente do script entre o carregamento de páginas. É importante assegurar-se
de que o  XMLHttpRequest é suportado, pois,
caso contrário, problemas e confusões podem ocorrer.

Dica #29 – Evite o uso de try-catch-finally

(http://dev.opera.com/articles/view/efficientjavascript/?page=2)

Sempre que o catch é
executado e a excessão capturada é atribuida a uma variável, essa
variável é adicionada ao escopo atual em tempo de execução. Alguns browsers não lidam eficientemente com esse processo, porque a
variável é criada e destruída durante a execução. Evite!

Dica
#30 – Não use o for-in indevidamente

(http://dev.opera.com/articles/view/efficientjavascript/?page=2)

Como o loop “for-in” requer que o mecanismo de script construa uma lista de todas as propriedades enumeráveis, codificar dentro do for loop não modifica o array. As iterações calculam o comprimento do array e salvam em uma variável len no escopo do loop.

Continuaremos com nossas
séries sobre gestão de desempenho, portanto… fique ligado!

?

Texto
original disponível em http://blog.monitis.com/index.php/2011/05/15/30-tips-to-improve-javascript-performance/