Por uma Web mais rápida: 26 técnicas de otimização de Sites

Postado em 12. set, 2011 por em JavaScript, Web Design

Já escrevi sobre Otimizações Web aqui no blog, além de já ter palestrado algumas vezes sobre o tema. Mas acabo de apresentar um Keynote no QCon SP 2011 com o título Por uma Web mais rápida: técnicas de otimização de Sites. Apesar de entrar em diversos assuntos, uma curta palestra nunca é suficiente para aprofundar muitos deles. Este post é uma continuação da palestra, com mais referências, estudos e aprofundamentos. Reserve pelo menos 30min para lê-lo; é um post bastante completo.

[Update] Interessado em Otimizações Web na prática com truques do básico ao avançado? Confira o novo curso online de otimizações da Caelum!


[QCon 2011] Por uma web mais rápida: técnicas de otimização de Sites (slides)

Por que otimizar nossos Sites é tão importante? Simplesmente porque nenhum usuário gosta de perder tempo esperando o carregamento das páginas. É extremamente irritante. E isso tem graves consequências, como mostram esses estudos:

  • O Yahoo! descobriu que, para cada 400ms de melhora na performance, seu tráfego aumenta em 9% (fonte).
  • Ao cortar 2,2s da landing page do Firefox, a Mozilla aumentou o número de downloads em 15%, totalizando um ganho de mais de 60 milhões de cópias por ano (fonte).
  • A Amazon concluiu que apenas 100ms de melhora aumentam 1% seu faturamento (fonte).
  • Em um de seus vários experimentos, o Google aumentou o número de resultados por página de 10 para 30. Isso aumentou o tempo de carregamento de 0.4s para 0.9s, o que diminuiu em 20% o tráfego das buscas (fonte).
  • A Microsoft mostrou que 2s a mais de latência no Bing diminuíam o faturamento em 4,3% (fonte).
  • Em um experimento, a Caelum subiu o tamanho de sua página de 100kb para 300kb, aumentando o número de requests de 12 para 42, o que resultou em um crescimento no tempo de carregamento de 2s para 6s. Os impactos foram queda de 21% no tempo que os usuários ficam no Site, menos 28% pageviews e uma queda de 18% no conversion rate.
  • Há diversos outros experimentos publicados, incluindo um estudo que mostra uma relação entre sites lentos e queda da pressão arterial (fonte).

Mas falar de otimizações de browser em um evento como o QCon pode parecer básico. Tantos arquitetos, discussões de alto nível sobre novas plataformas como Node.JS e processamento assíncrono, diversas palestras sobre cloud computing, todo mundo usando memcache e tantas outras técnicas avançadas.

Então, para contextualizar mais ainda a discussão, analisei os dados dos Sites de todos os participantes do evento. Com base nos e-mails dos inscritos (descartando webmails como GMail, Hotmail etc), separei mais de 100 domínios para testes, incluindo grandes portais brasileiros, empresas de tecnologia, Sites do governo e outros. Submeti todos ao WebPageTest.org e compilei os resultados.

O número mais importante, o tempo total de carregamento, já dá uma ideia da situação. Os sites analisados demoram, em média, 9 segundos para carregar, sendo que alguns demoraram mais de 40s. E a grande verdade é que a performance final para o usuário depende muito mais do client-side que do server-side. De todos os Sites analisados, a esmagadora maioria, 75%, tinha um tempo de processamento de menos de 400ms no servidor.

[Update] Interessado em Otimizações Web na prática com truques do básico ao avançado? Confira o novo curso online de otimizações da Caelum!

Há muito espaço para melhora na maior parte dos Sites. E a palestra aborda diversos tópicos de otimização.

Técnicas de otimização

Diminua o tamanho dos requests

Boa prática em qualquer aplicação distribuída, diminuir o payload, ou seja, o volume de dados trafegados, é um princípio básico. E há diversas formas de se fazer isso.

Na análise das páginas dos participantes do evento, a média de tamanho foi de 860kb. Além disso, 35% dos Sites têm mais de 1MB de tamanho, sendo que o pior caso chegava a ter incríveis 8MB.

#1 – Habilite GZIP

Há muito tempo que falo que habilitar o GZIP no servidor é o primeiro passo. Não leva mais de 30s para ser feito e é suportado em todos os navegadores e servidores dos últimos 15 anos. Com ele, todo conteúdo textual (HTML, CSS, JS etc) é comprimido antes de ser enviado para o cliente, chegando a cortar mais de 50% do tráfego total.

Apesar disso, na análise dos Sites, descobri que 43% de todos os requests textuais não estavam gzipados. Mais: apenas 14% dos Sites tinha gzip em todos os requests.

#2 – Minifique JavaScript

Um código JS bem feito é bem documentado, todo identado e possui nomes de variáveis legíveis. Mas nada disso conta na execução do script, e trafegar esse monte de bytes é desperdício. Em poucos minutos, é possível integrar uma ferramenta de minificação de JavaScript, como YUI Compressor, Google Closure Compiler ou UglifyJS.

Muitos Sites costumam incluir alguns scripts já minificados como o jQuery (com seu arquivo jquery-min). Apesar disso, dos Sites analisados, apenas 13% minificavam todos os JavaScripts.

#3 – Minifique CSS

Minificar os arquivos CSS é igualmente importante. Para isso, podemos usar o YUI Compressor e até o LESS compiler.

#4 – Comprima o HTML

O código HTML também pode ser comprimido, removendo espaços, comentários e até certas aspas e fecha tags desnecessárias. O Google, por exemplo, não fecha </html> ou </body> em sua home, já que isso não prejudica nenhum navegador e economiza mais alguns bytes.

O excelente HTML Compressor permite diversas otimizações e é bastante configurável. Comprimir o HTML não costuma ser simples porque, em geral, tratamos com páginas dinâmicas.

#5 – Não redimensione imagens no HTML

Princípio básico das otimizações, nunca deixe para diminuir imagens setando o width e o height no HTML ou CSS. Sempre redimensione o arquivo original e referencie o tamanho direto.

#6 – Otimize as imagens

Dentro de um arquivo PNG ou JPG muitos dados são guardados. Além das informações da imagem em si, há metadados como EXIF, e às vezes, até uma miniatura da própria imagem. Nada disso é necessário para renderizar a imagem na tela e podem ser removidos. Esse tipo de otimização, chamada de lossless, sem perda de qualidade visual, é o mínimo que toda aplicação deveria fazer. Com o Smush.it, por exemplo, basta enviar as imagens e recebê-las de volta otimizadas. Outras ferramentas incluem o ImageOptim além de diversas opções em linha de comando para automatização (pngquant, optipng, pngcrush, pngout, advpng).

Otimizar imagens é essencial porque costumam ser a parte mais pesada das páginas Web. Na análise dos Sites dos conferencistas, em média, 47% dos bytes da página eram de imagens.
Apesar disso, apenas 15% dos Sites otimizam todas as imagens. Para 1/4 dos Sites, otimizar as imagens economizaria mais de 40% dos bytes totais.

Mas é possível também aplicar transformações lossy, isto é, diminuir a qualidade das imagens em prol de uma melhora na performance. Muitos designers nem cogitam essa possibilidade, mas fato é que muito no mundo é lossy. Um MP3, por exemplo, diminui a qualidade do áudio original para favorecer a mobilidade. Diminuir a qualidade de uma foto JPEG com pouco impacto visual perceptível pode trazer imensos ganhos. O novo serviço JPEGMini, por exemplo, tem um avançado algoritmo que diminui a qualidade de JPEGs baseado em um modelo matemático que simula as características da percepção humana. O resultado são imagens com menos da metade do tamanho e visualmente idênticas.

Para saber mais, veja a palestra de Billy Hoffman na Velocity Conf 2011.

#7 – Pense no formato das imagens

Os formatos de imagens usáveis na Web são PNG, JPEG e GIF. Mas qual usar e como escolher o formato correto? Há diversos fatores. PNG e GIF mantém fidelidade da imagem; já o JPEG é um formato lossy cuja compressão sempre causa perda de qualidade (aliás, é por isso que jamais se deve editar JPEGs diretamente; cada vez que se salva o arquivo, perde-se qualidade). Com isso, um PNG costuma ser mais interessante para gráficos quando fotos ficam com tamanhos menores em JPEGs.

Outro ponto é que PNGs suportam transparência com canal alpha, equanto que GIFs têm apenas transparência total e JPEG não suporta transparência. De modo geral, PNGs hoje são superiores a GIFs e o único motivo para usar o último é quando há animações.

Mas mesmo ao usar PNG, é possível escolher entre dois formatos diferentes: PNG8 e PNG24. O PNG clássico é o de 24bits que suporta milhões de cores e é exportado por padrão por todas as ferramentas gráficas. Mas o PNG8 diminui a palheta para 8bits, 256 cores no máximo, assim como os antigos GIFs. A vantagem do PNG8 é que tem um tamanho bem menor e é muito útil para imagens com poucas cores (logos, gráficos simples etc).


#8 – Diminua cookies e headers

Um último passo para diminuir o tráfego é minimizar os headers envolvidos na requisição e na resposta. Destes, os cookies costumam ser o pior vilão pois são enviados a cada request entre cliente e servidor. Há até a recomendação de servir conteúdos estáticos de domínios sem cookies.

Diminua a quantidade de requests

Outro princípio base de qualquer sistema distribuído, minimizar o número de invocações remotas é essencial para boa performance. Na Web, isso significa diminuir os requests feitos na página para recursos externos – arquivos JS, CSS, imagens, Flash, vídeos etc.

No estudo dos Sites dos participantes da QCon, a média de requests é de 65 por página, sendo que 17% possuem mais de 100 requests.

#9 – Junte arquivos JavaScript

A análise mostrou que, em média, os Sites chamam 10 arquivos JavaScript externos. O pior caso era um Site que chamava incríveis 54 arquivos JS. A solução é simples: juntar vários arquivos e diminuir o total. O ideal é isso ser feito dinamicamente pela aplicação ou em build time, para que não seja necessário fazer manualmente. Não existe um número ideal de arquivos JS, mas eu recomendo entre 3 e 5 arquivos, no máximo.

#10 – Juntar arquivos CSS

O mesmo princípio vale para arquivos CSS. Nesse caso, recomendo 1 ou 2 arquivos externos. Na análise dos Sites, a média foi de 5 arquivos por página, sendo que o pior caso chegou a 24 arquivos CSS externos.

#11 – Use Sprites

Aplicar a mesma ideia de juntar arquivos a imagens não é tão simples. As sprites são imagens que unem diversas outras em uma só, como essa usada no Google:

O problema é criar essas imagens, algo difícil de se automatizar, e de gerenciar o CSS necessário para posicionar cada pedaço no lugar certo. Há ideias para automatização como o Sprite.me, o SpriteMapper, o SpriteCow e o SmartSprites.

Ao criar sprites, muitos pontos precisam ser pensados: é difícil lidar com imagens que precisem de repetições. É preciso pensar em espaçamentos entre as imagens para facilitar o posicionamento no CSS, ao mesmo tempo que não se deixe a sprite com área muito grande, o que causaria um grande uso de memória no navegador. É preciso pensar na similaridade das imagens para que, ao juntá-las, não tenhamos uma palheta de cores maior e pouca compressão. Temos que decidir o formato da sprite (PNG? JPEG?) e como unificar as mesmas características de qualidade e compressão de diversas imagens.

É complicado fazer Sprites mas, essencial para uma otimização séria. Na análise dos Sites dos participantes da QCon, mais da metade referencia 36 imagens ou mais. No pior caso, 144 imagens foram incluídas em uma única página.

#12 – Use Data URIs

Esse é um recurso perigoso mas extremamente útil. Assim como podemos embutir conteúdos de CSS e JS no meio do HTML quando conveniente, com as data URIs, podemos embutir imagens e outros elementos binários. Não é um recurso para ser abusado, já que aumenta o tamanho do HTML e não permite que a imagem seja cacheada e referenciada em lugares diferentes. É possível usar data URIs em arquivos CSS cacheáveis, prática mais recomendada.

A ideia é transformar os dados binários de uma imagem em base64 e colocar diretamente no src de uma imagem. Um problema é que só há suporte no IE a partir da versão 8, apesar de todos os outros browsers suportarem há bastante tempo. Isso não impede que se sirva versões diferentes do Site para browsers antigos, por exemplo. O Google Images é um exemplo emblemático de uso de data URIs.


#13 – Configure os headers

A estratégia aqui é permitir que recursos estáticos sejam cacheados pelo navegador, evitando novos requests quando o usuário visitar a página novamente. Em poucos segundos é possível configurar o servidor para servir requests com valores apropriados de Expires, Last-Modified, Cache-Control e ETag.

No estudo dos Sites, descobri que ao acessar a mesma página duas vezes, o segundo acesso dispara, em média, 46 novos requests. E, ainda, 87% dos Sites disparam mais que 10 requests nesse segundo acesso, um forte indício de que pouco se usa o recurso de cache do navegador. Um valor razoável seria manter esse número em menos de 5 requests e, se possível, apenas 1 ou 2.

#14 – Tire firulas do design

Polêmico, esse tópico propõe que o layout seja feito com performance em mente. Talvez muitos designers discordem, mas os números mostram que velocidade é mais importante para o usuário do que designs detalhistas e carregados.

Essa prática inclui diminuir a dependência do layout por imagens externas, evitar o uso de fontes externas, não usar Flash para design, entre outros.

Performance é medida pela percepção do usuário

A percepção humana é muito menos racional do que imaginamos. E, na Web, isso reflete diretamente em como os usuários percebem a velocidade do Site (e credibilidade, atratividade etc). Há estudos que mostram que a percepção de tempo de carregamento dos usuários é, em média, 15% pior que a real. E, quando perguntados tempos depois sobre a performance de um Site, a lembrança costuma ser 35% pior que a velocidade real (fonte).

Na Web, o número de segundos para a página carregar e a nota do YSlow são métricas importantes, mas não são tudo. Performance Web tem tudo a ver com com Usabilidade e UX, e é o usuário final quem fala o quão rápido está um Site ou não.

Existem diversas técnicas de otimização que não afetam o tempo de carregamento da página e talvez não melhorem sua nota no YSlow. São técnicas para tornar a percepção do usuário mais favorável ao seu Site, dando a sensação de velocidade mesmo que o relógio diga o contrário.

#15 – Especifique o tamanho das imagens

Fácil de implementar, essa prática tem um grande impacto visual para o usuário. Quando não especificamos o tamanho da imagem, o navegador não reserva um espaço na página para ela. O efeito é que, quando a imagem chega, ela é posicionada em seu lugar empurrando o restante do conteúdo. Isso dá a sensação de que os elementos da página estão se movendo e que ela ainda não está carregada. É uma péssima prática de usabilidade e dá a sensação de mais lerdeza.

Simplesmente especificar o tamanho correto da imagem no width e height do HTML ou CSS faz com que o browser já reserve o espaço para a imagem mesmo antes de seu download acabar. Quando ela chega, o navegador não precisa abrir espaço e empurrar os outros elementos, dando a sensação de que a página está sendo carregada mais rapidamente. Além disso, ao evitar o reposicionamento de elementos, evita-se reflows e repaints desnecessários.

#16 – Coloque o JavaScript no fim

Código JavaScript, interno ou externo, bloqueia a renderização de tudo que vem abaixo dele. Em alguns browsers, bloqueia inclusive o download de componentes seguintes. Para evitar esse bloqueio, coloque o JavaScript o mais pra baixo que puder; se possível, logo antes de fechar o body.

O efeito mais comum de JavaScript mal posicionado é a tela ficar em branco durante muito tempo, adiando o início da renderização. O senso comum manda colocar os JavaScripts no head, o que causa o bloqueio da renderização da tela toda. Na análise dos Sites dos conferencistas, a média de espera para o início da renderização foi de 4,3s. O pior caso deixava o browser totalmente branco durante 25s. O Site da Caelum, por exemplo, inicia a renderização em aproximadamente 0,7s.


#17 – Coloque o CSS no topo

O CSS também bloqueia a renderização da tela mas, neste caso, isso é melhor na maioria das vezes. Colocar o CSS para baixo causaria o efeito conhecido como FOUC – Flash of Unstyled Content. A página é renderizada sem estilo e, quando o CSS acaba de baixar, ela é redesenhada com o estilo.

Embora isso faça com que a página comece a ser mostrada antes para o usuário, na maioria dos Sites, mostrar uma página sem estilos não tem valor algum para o usuário. O layout fica sem estrutura, sem organização, e o efeito é aparentar que a página está demorando mais para carregar. Por isso, coloque o CSS no topo do documento, de preferência no head.

#18 e #19 – Adie o carregamento do que puder e Abuse do carregamento assíncrono

Uma das técnicas avançadas mais discutidas ultimamente – e das mais eficazes – é o uso de carregamento assíncrono de componentes da página. Isso evita bloqueios na renderização e faz a página ficar mais responsiva. Fiz um post só sobre esse assunto aqui no blog.

#20 – Otimize o First-View e o Above the Fold Time

Como diz o ditado, a primeira impressão é a que fica. Isso significa otimizar ao máximo a primeira visita do usuário, aquele onde o cache do navegador vai estar vazio, aquela quando ele ainda não conhece seu Site, e aquele onde ele traz todas suas expectativas.

É preciso entender como a interação do usuário acontece, e priorizar os componentes e a ordem da renderização da página para esse primeiro contato. Há quem fale em uma nova métrica, o Above the Fold Time – AFT – que mede o tempo de tempo de carregamento do início da página, “acima da dobra”, aquela parte que o usuário vê sem fazer scroll. O scroll infinito do Twitter é um exemplo disso; os dados mais para baixo só são carregados quando o usuário faz scroll até lá. Ou ainda a página de produtos da Amazon que deixa para carregar alguns componentes do fim da página só quando o usuário chega lá.

Mesmo sem usar técnicas avançadas como o scroll infinito, priorizar o AFT é pensar na ordem dos elementos no HTML para que as coisas que serão exibidas antes carreguem primeiro. É adiar aquele widget do Facebook que fica no fim da página para ser carregado só depois do onload, por exemplo. É prover um menu de opções que não dependa de JavaScript para funcionar, já que este será executado por último. No fim, é focar na primeira experiência do usuário e adiar tudo aquilo que não é necessário para isso.

#21 – Design performático

Uma área que mereceria um post por si só é como o design da página pode afetar a percepção de velocidade do usuário. O Google Reader antigamente usava um fundo azul claro em sua barra lateral e resolveu experimentar trocar para branco. Quando perguntados, os usuários, em sua maioria, afirmaram que o “novo Site” era mais rápido que o anterior (fonte).

A Psicologia da Performance envolve muitos tópicos de design, UX e usabilidade. Uma layout mais leve, uma arquitetura de informação mais simples, um call-to-action mais direto influenciam diretamente em como os usuários percebem a performance.

Bônus: mais tópicos


#22 – Automatize

O segredo para um Site com performance consistente e durável é automatizar o processo. Faça um script que minifique JS e CSS, automatize a otimização das imagens, etc. Qualquer processo repetitivo deve ser automatizado, caso contrário será logo deixado de lado pela equipe.

#23 – Use ferramentas de diagnóstico

Monitore suas páginas constantemente com ferramentas de diagnóstico. Há diversas disponíveis:

  • Painéis de monitoramento dos próprios navegadores, como Firebug, Chrome Developer Tools, Opera Dragonfly, e IE Dev Toolbar já nos dão muitas informações.
  • Fora isso, as clássicas extensões YSlow e PageSpeed (disponíveis para Chrome e Firefox) apresentam relatórios completos com dicas e problemas de performance.
  • O PageSpeed em particular possui uma versão online muito fácil de usar.
  • Outra ferramenta online fantática é a WebPageTest.org, usada para gerar as estatísticas usadas nessa apresentação. Ela permite testar do IE6 ao IE10, além de Chrome e Firefox. Gera screenshots, gráficos, grava vídeos comparativos e provê uma análise com dicas de otimização. Além disso, o framework é aberto e pode ser rodado internamente ou instalado em uma imagem da Amazon EC2.
  • O Google Analytics pode ser configurado para guardar estatísticas da velocidade do site. O interessante é usar essa capacidade para cruzar dados com outras métricas para descobrir os impactos da performance sobre os usuários da sua aplicação.
  • O Google Webmasters Tools mostra informações sobre a performance do site em comparação com os outros sites indexados pelo Google.

#24 – Pré-carregue componentes

Em alguns casos, ao visitar uma página, você quase que certamente sabe qual será a próxima página visitada pelo usuário. Pense na home do Google que certamente será seguida por uma visita à página de resultados da busca. Ou ainda em um fluxo de fechamento das compras de uma loja virtual em vários passos.

Nessas situações, pode ser interessante que a primeira página pré-carregue elementos que serão utilizados na página seguinte. CSS, JavaScript e imagens podem ser pré-carregados via código, antecipando o download de componentes que tem grande chance de serem usados depois. Obviamente, essa prática só deve ser usada se você configurou os headers de cache apropriadamente, senão os componentes serão baixados duas vezes.

Essa prática tem um imenso ganho de velocidade ao visitar a segunda página. Deve-se, porém, tomar cuidado para que não se prejudique a performance da primeira. O ideal é fazer esses pré-carregamentos somente quando a página inicial terminar de carregar todos os seus componentes, possivelmente depois do onload da mesma.

#25 – Escreva código eficiente

Em alguns raros casos o performance pode ser bastante afetada por más práticas de codificação de HTML, CSS ou JavaScript. Note, porém, que a maioria das técnicas mais eficazes costumam ser pouco influenciadas por micro otimizações de código; o problema costuma ser mais estrutural.

Porém, quando a aplicação é carregada, cheia de recursos ricos, o código pode ser otimizado. Há diversos seletores CSS que deixam a renderização bem mais lenta. O alto número de elementos no DOM também diminui a performance. Usar iframes em excesso então é um quase um crime. E há também as práticas de otimização de código e lógica JavaScript, como quebrar longas tarefas em pedaços menores com WebWorkers ou setTimeout, evitando bloqueio da tela.

#26 – Dispare logo o onload

O evento de onload é esperado por muitos scripts para que sua execução prossiga. Além disso, costuma ser a métrica usada para medir performance em ferramentas como Analytics e Webmasters Tools. Desde 2010, o Google usa a velocidade do Site como uma das variáveis do rankeamento das buscas, e isso tem a ver com o onload. Depois do disparo do onload, o indicador de carregamento do navegador para de girar, dando a impressão de fim do carregamento.

Há vários motivos para se otimizar o tempo de onload, muitos explicados por Steve Souders em seus livros. Abusar do carregamento assíncrono ajuda a implementar essa prática.

Quebre as regras

Não se prenda a números exatos que sua ferramenta de diagnóstico dá. Quebre algumas regras quando elas se mostrarem melhores para o usuário. A técnica de pre-carregar componentes da página seguinte vai piorar sua nota no YSlow, pois o número de requests aumenta, o tamanho total aumenta; mas é uma técnica que sabemos que melhora a performance para o usuário.

Várias das outras regras podem ser quebradas em casos específicos. Há quem diga que home pages de portais deveriam embutir CSS e JS diretamente no HTML para economizar requests. Há quem pregue que o JavaScript não deve estar no final da página, mas logo depois do fold, já que não há muito problema em bloquear a renderização da parte não visível da página. Há situações onde você quer redimensionar imagens no HTML, como ao fazer um design responsivo.

Não se prenda a números, foque na experiência do usuário.

Referências

Sérgio Lopes

Mais sobre o autor

Tags: , , , , , ,

49 Respostas para “Por uma Web mais rápida: 26 técnicas de otimização de Sites”

  1. Fantástico!!!

    Muito esclarecedor!!

    Obrigado!

  2. Mendel Gusmão

    12. set, 2011

    Gostei bastante dessa palestra. Gostaria de ter falado na hora sobre algo que fiz no ano passado, em específico sobre a otimização de entrega de JS, mas a timidez não permitiu.

    Então deixo o link do artigo no meu blog: http://wp.me/pARX5-4g

    Forte abraço

  3. Felipe Z. Affonso

    12. set, 2011

    Simplesmente incrível o POST. Perdi a palestra, uma pena.
    Parabéns, Sérgio! Competente desde sempre.

  4. Raphael

    12. set, 2011

    Really greeeeeeattttt

  5. Vitor

    12. set, 2011

    Uma das melhores palestras do #QconSP parabéns, realmente incrivél

  6. Rafael

    12. set, 2011

    Parebens Sergio, muito bom. Sua palestra foi uma das melhores do evento.

  7. Tárcio Zemel

    12. set, 2011

    Muito bom o artigo!

    Só uma observação quanto à dica de que o js deve ser minificado e vir no rodapé é que isso ajuda, sim, mas ainda não é a solução ideal.

    Pessoalmente, prefiro usar uma ferramenta de carregamento/execução em paralelo, tal como HEADjs.

    Abraços!

  8. Sérgio Lopes

    12. set, 2011

    Pessoal, obrigado pelos feedbacks!

    @Tárcio:

    Concordo sobre o assíncrono, até comentei na palestra. Eu cheguei a usar já vários desses frameworks (até submeti bug pro HEADjs), e acabei optando pelo LABjs. Não é tão completo mas é o que se mostrou mais performático pra mim (escrevi sobre ele aqui).

    Uma coisa que sempre me incomodou foi usar um script no head pra carregar o framework, alem de ser um request a mais. Ultimamente tenho explorado o uso de assincrono com async do HTML5 e o snippet classico que insere no DOM dinamicamente (tipo o Google Analytics novo). O site da Caelum, por exemplo, não usa mais LABjs mas a performance é comparavel a antes quando usavamos, graças a outros truques. O que vejo é que esses frameworks são cada vez menos necessarios nos browsers modernos que ja conseguem fazer download paralelo dos scripts e ate executa-los assincronamente (async do HTML5). Nos meus testes, o abandono do LABjs so piorou (um pouco) a experiencia no IE6 e IE7, mas que sao poucos usuarios no caso da Caelum.

    Mas realmente é preciso avaliar o uso desses frameworks de assíncrono, às vezes vale a pena.

    Abraços

  9. Davi Nogueira

    12. set, 2011

    Olá Sergio, excelente post. Pena que não pude comparecer ao evento.

    E quanto as tecnologias como o GWT e ExtJS, qual sua opinião quanto a performance?
    Até onde eu sei, o javascript gerado por esses frameworks é quem gera o html e o css, nesse caso o processamento fica todo no cliente. O que nem sempre é rápido, o gmail mesmo usando numa maquina mais antiga, já não é aquelas coisas de rápido.

  10. Sérgio Lopes

    12. set, 2011

    @Davi: eu pessoalmente não uso nenhum dos dois. Tecnologias que geram JS te deixam sem controle fino das coisas, mas ainda há esperança para otimizações. O GWT por exemplo tem varias estrategias de otimização e mesmo o ExtJS voce pode modularizar etc.

  11. Davi Nogueira

    12. set, 2011

    @Sergio, realmente esse controle fino fica difícil de se fazer.
    Minha dúvida é mais porque eu tenho a impressão que o gmail esta ficando mais lento, conforme vão adicionando funcionalidades, pode ser impressão minha.
    O Google Groups mesmo é um que depois da nova interface pra mim ficou mais evidente a queda de performance, mais também pode ser só impressão minha.

  12. Sérgio Lopes

    12. set, 2011

    @Davi
    Tambem to achando o Google Groups mais lento. Nao sei os numeros, mas a percepcao final é de lerdeza mesmo.

    Mesma coisa com o Twitter novo; cheguei ate a discutir isso com um engenheiro la quando saiu o #newtwitter. A arquitetura ficou melhor mas pro usuario a sensacao de lerdeza é bem maior.

  13. Márcio

    12. set, 2011

    Ótima palestra ! é bom lembrar a preocupação que temos que ter com os usuários #QconSP

  14. Gledson Fagundes

    13. set, 2011

    Ainda não tive a oportunidade de testar, mas seria interessante converter as imagens em base64 em coloca-las junto da página gerada? Assim seria possível economizar os requests para as imagens ao custo de um html maior. Alguém já tentou?

  15. Renan

    13. set, 2011

    Excelente post. Parabens.

  16. Mathieu

    13. set, 2011

    Muito bom!!! Também:
    - Reduzir número de request
    - Evitar redirect (301, 302)
    - Se fizer sentido, carregar por ajax para não recarregar toda a página a cada click. Isso é mais verdade ainda em intranet corporativas já que não precisamos indexação das páginas no google. Então tem que ser bem ponderado. Imaginem o gmail recarregado inteiramente a cada click de página.

  17. Maicon Sobczak

    13. set, 2011

    Ótimo texto, bem resumido e os links para aprofundamento dos estudos ajudaram bastante.

  18. diego lovison

    15. set, 2011

    @sergio
    “Tecnologias que geram JS te deixam sem controle fino das coisas”
    o que seria isso?

  19. Sérgio Lopes

    15. set, 2011

    @Diego
    Quis dizer que você não tem muita chance de controlar/alterar/otimizar seu JavaScript se você está usando uma ferramenta que gera código pra você (como em um JSF da vida).

  20. diego lovison

    15. set, 2011

    @sergio.. sobre jsf não sei te dizer ao certo, parecia que vc tava falando do gwt em especifico..

    so para complementar…
    mas sobre o gwt, o compilador é muito melhor do que os minifiers javascript, ele remove metodo que não é utilizado, otimiza todo o código fonte, gera chamada estática, e cria um javascript que executa mais rapido do que um criado na mão. isso é o que diz na documentação rsss
    como o codigo é compilado você não tem o que otimizar, a performance e otimização do que está sendo executado, deve ser no codigo fonte feito pelo desenvolvedor, assim como é com java no .class não tem o que fazer..
    ;)

    parabéns pelo seu keynote o evento foi muito bom!
    abraço

  21. Sérgio Lopes

    15. set, 2011

    @Diego

    Concordo que, dessas opções que escondem o JS de mim, o GWT é o melhor, com mais otimizações. Mas ainda dificulta eu escolher quantos js quero, o momento que executam, carregá-los assincronamente e outras otimizações. Mas sem dúvida que o compiler dele é melhor que muito minifier por aí!

  22. Diego Lovison

    15. set, 2011

    @sergio
    Na verdade não, você consegue ter todos esses controles.
    Sua aplicação é toda em java. Quando colocar em produção, ela é compilada. Essa compilação gera 6 js, um para cada navegador, por que a otimização é por navegador também. Então “sua aplicação é um js” somente. Isso gera um problema, por que se sua aplicação for muito grande seu load inicial será muito grande.
    Para resolver esse problema existe o RunAsync que faz o code split. Dessa forma, você consegue dividir sua aplicação em vários js que são carregados de forma assíncrona. Esse carregamento acontece quando você precisar desses js. O gwt faz todo esse controle e deixa o desenvolvedor livre disso.
    A ideia é ter um load inicial muito rápido com isso. Exemplo: Carregar somente a tela de login, após o login carregar uma parte da aplicação.
    ;)

  23. Sérgio Lopes

    15. set, 2011

    @Diego

    Excelentes dicas de GWT! Nao conhecia o RunAsync, realmente eles estao bem avancados nessa parte de otimizacoes (é o Google ne!).

    Deixam outras ferramentas que geram JS a comer poeira. JSF, por exemplo, está a anos-luz de distância de ter controles tão finos de otimizações.

  24. Rafael

    19. set, 2011

    Pra ficar perfeito o o artigo e blog em geral, poderiam haver exemplos na prática..

  25. Lucas Peperaio

    21. set, 2011

    Favoritado!

  26. Marcelo Lourenço

    28. set, 2011

    Data URI

    Sergio, qual programa utilizo para transformar imagem em código?
    Abraços!

  27. Sérgio Lopes

    28. set, 2011

    Oi Marcelo!

    Para Data URIs você pode usar o cssembed: https://github.com/nzakas/cssembed
    É uma ferramenta linha de comando que gera as coisas estaticamente.

    Ou se preferir, você pode fazer sua aplicação calcular dinamicamente dependendo do tipo de browser por exemplo. Em Java, eu uso a classe “Base64″ do Apache Codec.

    Abraços

  28. Carlos Alberto Nakazawa

    08. nov, 2011

    Muito bom o artigo, parabéns! Já corrigi várias coisas no nosso site! Só um detalhe que aconteceu com a gente, a compactação estava habilitada no JBoss, porém como usamos o Apache como Proxy reverso para a porta 80, os dados não chegavam corretamente ao cliente. Foi então desabilitada a compactação no Jboss e habilitada na configuração do proxy reverso no Apache. Vivendo e aprendendo.

  29. Rodrigo Pinheiro Matias

    01. dez, 2011

    [...] que podem ser utilizadas para otimizar o tempo gasto em uma requisição. O Sérgio fez um post mais detalhado sobre o assunto, leitura obrigatória para todos os [...]

  30. Rafael Machado

    09. dez, 2011

    Se houvesse uma lista de top10 tópicos do blog da Caelum, este aqui deveria estar dentro.

    O melhor de tudo é que a maioria das dicas é server agnostic.
    Então pude fazer um bom paralelo com o que já sei de Django e Nginx.

    Parabéns pelo esforço

  31. Caio Ribeiro Pereira

    16. dez, 2011

    Excelente Post!

    Essas são dicas que todo desenvolvedor front-end deve aplicar em seus projetos! :D

  32. Mozart

    24. jan, 2012

    Excelente artigo! Parabéns pelo conteúdo.

  33. Glauber

    03. fev, 2012

    Excelente artigo! Meus parabéns e obrigado por compartilhar conhecimento.

  34. Tárcio Zemel

    11. abr, 2012

    Relendo este artigo novamente, desde a última vez que comentei, depois de estudar mais sobre otimização, hoje penso que usar recursos combinados/minificados é a melhor opção.

    Carregar somente 1 arquivo js e 1 arquivo css para o site (genericamente falando), produz uma “percepção de performance” melhor, realmente! :-)

  35. Sergio

    26. abr, 2012

    Como habilita o gzip? Não entendo como faz :)

  36. Sergio

    26. abr, 2012

    #5 – Não redimensione imagens no HTML
    Então porque sites como o GTmetrix aponta como erro todas as imagens sem definições de width e height?
    A google quer paginas rapidas, mas nem gzip suporta.

  37. Sérgio Lopes

    26. abr, 2012

    Oi Sergio!

    O GZIP depende do servidor que você está usando. Todos eles suportam, precisa ver na documentação como habilita.

    Sobre as imagens, repare que há duas regras: #5 e #15. Você deve especificar o tamanho do width e height no HTML como você disse para evitar que o navegador redesenhe a tela.

    Mas você não deve redimensionar via width/height no HTML. Ou seja, não vá criar uma imagem de 1000px e colocar 100px no seu HTML. Se você precisa que ela ocupe 100px de tamanho, crie uma imagem do mesmo tamanho.

    Do Google eu não entendi. Ele suporta GZIP sim, em tudo deles aliás, qualquer produto/site.

    Abraços!

  38. Sergio-F

    27. abr, 2012

    Acho que eu entendi, não pode redimensionar, o ideal é deixar a imagem com o tamanho que quer e definir um height e width. =D
    #1 Refiz o teste do gzip em outro site e desta vez funcionou, useu este link: http://www.gidnetwork.com/tools/gzip-test.php
    que bom pois não tem tutorial de gzip para blogger.

    São dicas muito ótimas, mas quem já é profissional aproveita mais as dicas, pessoas leigas ficam com blog lento pois não há documentação em portugues suficiente e nem recursos suficientes para deixar o blog rápido, por exemplo um tal de “widget_css_bundle.css”, ocupa 48.6% de css não usado, mas já revirei o html do aveso e não acho ele (aparece no código fonte do navegador e no blogger não aparece, “o.O”).
    Eu sei o mínimo de html e quase nada de javascript, por causa disso eu não posso aproveitar todas as dicas assim como outros igual a mim.
    Exemplo do que não entendi:

    #2 São muitos complicados, o mais simple que eu acho é esse: http://jscompress.com/
    #4 difícil de entender, mas achei esse mais fácil: http://htmlcompressor.com/compressor.html
    #8 no blogger não achei uma maneira pra isso, no gtmetrix é um dos erros que não entendo “Specify a cache validator”.
    #9 e #10 vish
    #12 maios ou menos, parece fácil
    #13, #20, #22 e #24 não sei.

    Mas com essas dicas já está ajudando muito, meu blog passou a “YSlow Grade” de nota “D” para “C”, carregamento de 6s para 4.75s, tenho um blog de 1.29MB e 119 request, acho que pode melhorar.

  39. Sérgio Lopes

    27. abr, 2012

    Realmente, a maior parte das dicas é para quem vai fazer o código da página. Usando uma plataforma mais fechada como o blogger, eles é que deveriam dar boa parte das otimizações já prontas.

    Mas que bom que está melhorando a performance! Bons resultados já!

  40. Sergio-F

    27. abr, 2012

    Pensei em focar primeiro somente na otimização de imagens, quem sabe o blogger facilite depois.
    Uma de 7,94 kb passou a ser de 445 bytes no Smush It

  41. Sergio-F

    30. abr, 2012

    Uma dica para a número 5:
    “#5 – Não redimensione imagens no HTML”

    Como eu uso o “resumo de postagens automático”, eu notei que a primeira imagem da postagem era automaticamente redimensionada para 100×100 (o que deixa lento).

    A dica é deixar um tamanho maior para as postagens resumidas Ex:320×240, Aí terá que botar uma imagem de também 320×240 nas postagens, pelo menos na primeira imagem da foto, (dá pra aproveita e deixar um texto ao lado da primeira imagem 320×240 da postagem).
    O mesmo serve para o slide de postagem (para poder usar o mesmo link)

    Espero que eu tenha explicado bem.

Trackbacks/Pingbacks

  1. Por uma web mais rápida: compressão radical de JavaScript – parte 1 « pura:destruição - setembro 12, 2011

    [...] inspirado pela palestra do Sérgio Lopes sobre otimização de sites, que foi apresentada na #QConSP. Gostaria de ter [...]

  2. QConSp 2011: eu fui! | Eduardo Mendes - setembro 12, 2011

    [...] Uma das coisas mais bacanas foi ele ter realizado um estudo prévio com os sites dos participantes do evento e para cada técnica apresentada, ele exibiu médias (não muito animadoras, diga-se de passagem) dos problemas dos sites em relação a elas. Palestra organizada e “concisa”. Já estou esperando a do ano que vem! Veja a apresentação do Sérgio Lopes  [...]

  3. QConSP – Eu fui! | Anderson Fraga - setembro 15, 2011

    [...] http://meiobit.com/91155/jpegministartup-refina-de-forma-impressionante-compresso-de-imagens/ http://blog.caelum.com.br/por-uma-web-mais-rapida-26-tecnicas-de-otimizacao-de-sites/ http://dudumendes.com/2011/09/12/qconsp-2011-eu-fui/ [...]

  4. QCon 2011: como foi a segunda edição do principal evento de arquitetos e desenvolvedores no Brasil | blog.caelum.com.br - setembro 15, 2011

    [...] Por uma web mais rápida: técnicas de otimização de sites – Sérgio Lopes, Caelum. E um post completo sobre o assunto. [...]

  5. QCon SP 2011 | Blog do Nino - setembro 17, 2011

    [...] Por uma web mais rápida: técnicas de otimização de sitesSérgio Lopes, Caelum. E um post completo sobre o assunto. [...]

  6. [Caelum] Por uma Web mais rápida: 26 técnicas de otimização de Sites « Blog do Osiro - setembro 21, 2011

    [...] Continue lendo… [...]

  7. Como foram as palestras de arquitetura, java e engenharia ágil no QCon São Paulo | Dito - setembro 22, 2011

    [...] que podem ser utilizadas para otimizar o tempo gasto em uma requisição. O Sérgio fez um post mais detalhado sobre o assunto, leitura obrigatória para todos os [...]

  8. NoSQL – Do teorema CAP para P?(A:C):(C:L) | blog.caelum.com.br - dezembro 7, 2011

    [...] O tempo da resposta ou a latência. Da mesma maneira que um sistema offline pode custar caro, um sistema lento também pode. Por isso pode fazer sentido abrir a mão da consistência para diminuir a [...]

Deixar uma Resposta