↓ Arquivo ↓

Arquivo → agosto - 2010

Agilizando a compilação do GWT/Google Web Toolkit

Existem algumas coisas no mundo que demoram. Podemos citar entre elas a aprovação de qualquer coisa no congresso nacional, a redução de juros no Brasil e a entrega dos produtos enviados pela Deal Extreme. A compilação do GWT entra nesta categoria, mas ao contrário das 3 que citei, tem como melhorar “um pouco” seguindo algumas dicas.
O grande “problema” do compilador do GWT, é que ele tem um compromisso “sagrado” de tentar produzir um código Javascript melhor que o de um programador humano. Por isso, ele faz uma série de análises para que código não usado não seja convertido e não esteja presente no código final. Ele não deixa na versão compilada os métodos que você nunca usa e varíaveis nunca usadas. E também ele obfusca seu código. E isso leva tempo. Como diria a pensadora: “Isto não é feitiçaria, é tecnologia”. Por isso não existem milagres e essas dicas irão apenas ajudar a “diminuir a demora”.
Mas falando sobre a demora, existe outra coisa que pode deixar suas pausas para o café um pouco mais longas. É o fato de o GWT ter as “maravilhosas” permutações. Mas o que seriam as permutações Arnaldo? Isso pode? Claro que pode Galvão. As permutações são etapas em que o compilador do GWT compila diferentes versões do código para diferentes navegadores. Em vez de ter 1 código javascript com um monte de condições no meio tratando diferentes situações para diferentes navegadores, o compilador produz 1 código específico para cada navegador. Isso faz com que o código fique otimizado para o navegador do usuário, mas em contrapartida, faz com que a compilação fique mais demorada.
Irei falar sobre algumas opções para diminuir a demora. Você pode utilizar todas elas juntas, ou utilizar separadas. Fica a seu critério.

1. Evite utilizar Code Splitting

O Code Splitting é um recurso do GWT que posibilita que você quebre o código a faça com que ele seja carregado aos poucos.  O RunAsync(comando GWT.runAsync) serve para dizer onde se deve quebrar o código. Ele funciona bem, mas ele pode gerar um problema. São feitas uma série de análises adicionais para verificar os pontos de ‘quebra’ e separar os arquivos javascript a serem gerados. Dependendo do tamanho da aplicação e do número de pontos de quebra, a aplicação pode ficar ‘incompilável’ para muitas máquinas(por alto uso de memória e processamento). Então, analise a real necessidade de utilizar Code Splitting e se realmente aqueles KB’s a menos que o usuário irá carregar no início realmente farão diferença.

2. Go to hell IE6

Então daí que vem a segunda opção para diminuir a demora. Esta seria definir no GWT que você não quer compilar para alguns navegadores. Exemplo: Seu sistema só funcionará em IE8, Firefox 3 e Chrome. Não precisará funcionar em Opera, IE6, IE7 e versões antigas do Firefox. Então o que você faz é. Definir os navegadores que seu sistema terá suporte, e o resto que se f… fique sem compatibilidade. :) .
Para configurar os navegadores que você quer suporte, é só utilizar o seguinte comando no final de seu XML de configuração do módulo:

<set-property name=”user.agent” value=”ie6,ie8,gecko,gecko1_8,safari,opera” / >

Sendo as opções:

  • ie6 = Microsoft Internet Explorer 6 e 7;
  • ie8 = Microsoft Internet Explorer 8;
  • gecko = Mozilla Firefox 3.x e superiores;
  • gecko1_8 = Mozilla Firefox 1.5 e 2;
  • safari = Navegadores baseados em Webkit(Safari, Chrome, etc…);
  • opera = Opera.

3. LocalWorkers

Esta é a melhor técnica de todas as apresentadas na minha opinião. Consiste em você fazer com que sejam compiladas mais de 1 permutação por vez. Esta técnica só traz resultados reais para processadores de mais de 1 nucleo. Exemplo: Você tem um processador com 2 núcleos, então configuramos o GWT para compilar uma permutação por núcleo, sendo que ele sempre compilará 2 permutações simultaneamente.
Para configurar isso é fácil. È só passar um paramêtro para o compilador informando o número de localWorkers desejado. Para linha de comando é apenas “-localWorkers [numero]”. Em um script Ant é só utilizar o seguinte:

<java classname=”com.google.gwt.dev.Compiler” fork=”true” failonerror=”false”>
<arg value=”[modulo]” />
<arg value=”-localWorkers” />
<arg value=”[numero]” />
</java>

4. Verifique a configuração de localização.

Além de criar uma permutação para cada navegador, o GWT cria uma compilação por localização por navegador. Exemplo. Se eu tenho uma aplicação com suporte a todos os navegadores e com 2 opções de localização(ex: pt_BR e en_US), o GWT irá gerar 12 permutações, sendo que originalmente são 6. Se eu colocar mais uma opção de localização, o número de permutações sobe para 18. Então, se você vai utilizar apenas 1 opção, especifique para o GWT isso da seguinte forma, no arquivo XML de configuração do módulo:

<extend-property name=”locale” values=”pt_BR” />
<set-property name=’locale’ value=’pt_BR’/> <set-property-fallback name=’locale’ value=’pt_BR’/>