Marcio Trindade

Melhorar a velocidade da sua Aplicação

Hoje vou traduzir um artigo do Erik Andrejko falando sobre como melhorar a velocidade da sua aplicação Rails.

Leia o original aqui

Seus usuários ficam felizes quando não notam a velocidade que a sua aplicação responde. Se eles notarem esta velocidade é porque provavelmente está muito lenta. Muitas melhorias acontecem fora da sua aplpicação Rails.

Típico tempo de carregamento de páginas

Aqui está a saída do relatório "Safari Web Inspector - Netwrok". A página levou 3 segundos para carregar.

Safari Web Inspector

Repare que a aplicação Rails demorou apenas 300 ms, incluindo o tempo necessário para fazer o download do HTML gerado. Cerca de 90% do tempo foi usado para carregar os outros tipos: javascript, css e imagens.

YSlow

A principal ferramenta para analisar a velocidade de qualquer aplicação web é Yslow (Yahoo! YSlow for Firebug) do Yahoo. YSlow analisa a sua página e produz um relatório:

YSlow Report

Safari Desenvolver Menu

Instale o "Safari Develop Menu" com o seguinte comando:

console
defaults write com.apple.Safari IncludeDebugMenu 1

O "Safari Web Inspector - Network" vai produzir um relatório como acima mostrando o tempo gasto para carregar cada elemento da página.

Faça menos solicitações HTTP/Minify JS

Você deve enviar apenas 1 arquivo javascript e 1 arquivo css. Não mais. O plugin asset packager (Scott Becker - AssetPackager - JavaScript and CSS Asset Compression for Production Rails Apps) é um plugin que empacota automaticamente todos os seus arquivos CSS e Javascript em um arquivo. Instale com:

console
script/plugin install git://github.com/sbecker/asset_packager.git

Em seguida, produzir o asset_packages.yml com:

console
rake asset:packager:create_yml

Você precisará editar o arquivo config/asset_packages.yml para assegurar que os scripts são carregados na ordem correta.

Em seu application.html.erb layout arquivo coloque o seguinte:

application.html.erb
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js" type="text/javascript" charset="utf-8"></script>
<%= javascript_include_merged :base %>
<%= stylesheet_link_merged :base %>

O arquivo prototype.js será carregado a partir do Google. Com alguma sorte o usuário já o tem em cache.

Carregar arquivos em paralelo

A maioria dos navegadores faz, no máximo, dois pedidos simultâneos para cada host. Configure o seu production.rb para usar um outro host:

production.rb
# Enable serving of images, stylesheets, and javascripts from an asset server
config.action_controller.asset_host = "http://assets.yourhost.com"

Naturalmente que você terá que configurar o assets.yourhost.com para apontar para seu servidor web.

Adicionar um cabeçalho de Expiração/Gzip componentes

Se você estiver usando o Apache você pode configurar o virtual host para usar mod_deflate e também mod_expires

http.conf
<VirtualHost _:80>
  ExpiresActive On ExpiresDefault "access plus 1 month"
  AddOutputFilterByType DEFLATE text/html text/plain text/xml application/javascript text/css
  ...
</VirtualHost>

Etags

Rails 2.2 suporta Etags. Procure por um outro artigo sobre Etags no futuro.

Minha Contribuição

O Erik escreveu alguns pontos importantes. Porém não mencionou que o Rails também faz o empacotamento dos arquivos javascript e css. A diferença em relação ao asset_packager, é a biblioteca utilizada para comprimir os arquivos. O asset_packager consegue gerar arquivos menores, porém nem sempre você pode utiliza-lo no seu servidor de produção, neste caso utilize o helper do Rails da seguinte forma.

aplication.thml.erb
<%= javascript_include_tag "jquery", "default",  :cache => true %>

O mesmo pode ser feito para o css

application.html.erb
<%= stylesheet_link_tag "plugins/crossbrowser",  "default",  :cache => true %>

Uma ferramenta que muito me ajudou foi o Google Speed que como YSlow também é um plugin para FireFox porém já está disponível para versão 3.5.