Como acelerar o compilador gwt?

201

Estamos começando a fazer um uso mais pesado do GWT em nossos projetos, e o desempenho do compilador GWT está se tornando cada vez mais irritante.

Vamos começar a alterar nossas práticas de trabalho para mitigar o problema, incluindo uma ênfase maior no navegador de modo hospedado, que adia a necessidade de executar o compilador GWT até mais tarde, mas isso traz seus próprios riscos, principalmente o de não detectando problemas com navegadores reais até muito mais tarde do que gostaríamos.

Idealmente, gostaríamos de tornar o compilador GWT mais rápido - um minuto para compilar um aplicativo razoavelmente pequeno está irritando. No entanto, estamos usando o compile de uma maneira bastante ingênua, por isso espero que possamos obter ganhos rápidos e fáceis.

No momento, estamos invocando o com.google.gwt.dev.Compiler como um aplicativo java do ant Ant target, com heap máximo de 256m e muito espaço de pilha. O compilador é lançado pelo Ant usando fork = true e o Java 6 JRE mais recente, para tentar aproveitar o desempenho aprimorado do Java6. Passamos a classe principal do controlador para o compilador, juntamente com o caminho da classe do aplicativo, e assim por diante.

O que mais podemos fazer para obter velocidade extra? Podemos fornecer mais informações para que gaste menos tempo descobrindo o que fazer?

Eu sei que podemos dizer para compilar apenas um navegador, mas precisamos fazer testes em vários navegadores, o que não é realmente prático.

Todas as sugestões são bem-vindas neste momento.

skaffman
fonte

Respostas:

144

Vamos começar com a verdade desconfortável: o desempenho do compilador GWT é realmente péssimo. Você pode usar alguns hacks aqui e ali, mas não terá desempenho significativamente melhor.

Um bom truque de desempenho que você pode fazer é compilar apenas navegadores específicos, inserindo a seguinte linha no seu gwt.xml:

<define-property name="user.agent" values="ie6,gecko,gecko1_8"></define-property>

ou na sintaxe gwt 2.x e apenas para um navegador:

<set-property name="user.agent" value="gecko1_8"/>

Isso, por exemplo, compilará seu aplicativo apenas para IE e FF. Se você sabe que está usando apenas um navegador específico para teste, pode usar este pequeno truque.

Outra opção: se você estiver usando vários códigos de idioma e novamente usando apenas um para teste, poderá comentá-los todos, para que o GWT use o código de idioma padrão, isso reduzirá alguma sobrecarga adicional no tempo de compilação.

Resumindo: você não obterá um aumento de ordem de magnitude no desempenho do compilador, mas, tomando várias relaxações, poderá economizar alguns minutos aqui e ali.

Yuval Adam
fonte
3
Parece que para o GWT 2.0, você realmente deseja que esta sintaxe especifique um agente do usuário: <set-property name = "user.agent" value = "gecko, gecko1_8" />
mooreds
No GWT 2.2, não há lagartixa. O compilador declara que "o valor gecko não foi definido anteriormente. Exceção inesperada ao processar o elemento 'set-property'"
uthark
definindo o valor para "gecko1_8" só deve trabalhar para Firefox 1.5 e mais tarde no GWT 2.2
eaykin
Essa resposta tem quase dois anos. Sinta-se livre para editá-lo para esclarecer este ponto.
usar o seguinte
6
2013, ainda GWT tempo de compilação é uma porcaria qualquer um pode melhorar esta resposta para, GWT 2.5
Forhad
62

Se você executar o compilador GWT com o sinalizador -localWorkers, o compilador compilará várias permutações em paralelo. Isso permite que você use todos os núcleos de uma máquina com vários núcleos, por exemplo -localWorkers 2 instruirá o compilador a compilar duas permutações em paralelo. Você não terá diferenças na ordem das magnitudes (nem tudo no compilador é paralelelizável), mas ainda é um aumento notável se você estiver compilando várias permutações.

Se você deseja usar a versão de tronco do GWT, poderá usar o modo hospedado para qualquer navegador ( modo hospedado fora do processo ), que alivia a maioria dos problemas atuais no modo hospedado. Parece que é para onde o GWT está indo - sempre desenvolva com o modo hospedado, pois as compilações provavelmente não obterão magnitudes mais rapidamente.

Chi
fonte
2
Ah, a opção localWorkers é uma jóia, vale a pena conhecer. Infelizmente, a maioria das nossas caixas de desenvolvimento são xeons de núcleo único. Esse OOPHM também parece muito promissor. Sempre na próxima versão, é ...
skaffman
4
virtualize um ambiente de compilação em uma caixa com vários núcleos; remoto para este vm; executar compilação de linha de comando GWT usando -localWorkers, com locais mínimos e user.agents; verifique se a caixa que hospeda a VM é um ponto de rede para onde você está implantando. A combinação disso reduz sua compilação para cerca de 30 segundos com implantação no tomcat. Além disso, tudo isso pode ser escrito em um script. Você também pode desenvolver em uma máquina local, criar um patch svn e fazer com que seu script aplique o patch usando algum tipo de compartilhamento NFS ou samba, eliminando a necessidade de copiar apenas as diferenças src. yay!
kr.
O cliente NX também é um enorme +++ para desenvolvedores remotos em conexões ADSL, a cabo ou WiFi limitadas. Além disso, você está sempre sincronizado, não importa qual comp esteja usando em qualquer local com internet
kr.
O padrão é o número de CPUs disponíveis na plataforma na compilação maven. Então, não acelere aqui para mim.
keiki
55

Embora essa entrada seja bastante antiga e a maioria de vocês provavelmente já saiba, acho que vale a pena mencionar que o GWT 2.x inclui um novo sinalizador de compilação que acelera as compilações ignorando otimizações. Você definitivamente não deve implantar o JavaScript compilado dessa maneira, mas isso pode economizar tempo durante as compilações contínuas que não são de produção.

Basta incluir o sinalizador: -draftCompile na sua linha do compilador GWT.

monzonj
fonte
3
Usei essa opção e, em nosso projeto, algumas vezes falhava com um erro estranho. Portanto, esteja ciente de que, às vezes, a compilação pode não funcionar por causa disso.
Vic
31

Aqui está uma lista dos valores user.agent nos quais você pode configurá-lo.

(Adicionando este aqui porque eu manter acabar aqui quando eu procurar o que devo definir para torná-lo só produzem uma permutação de cromo resposta é:. <set-property name="user.agent" value="safari"/>)

Stephen
fonte
Onde devo adicionar este elemento set-property? Tentei adicioná-lo dentro e fora do elemento <module> no meu arquivo app.gwt.xml e ele não funciona.
Alex Worden
Ele entra no arquivo ABC.gwt.xml do módulo, em que ABC é o nome do módulo.
26512 Glenn
30

Nas versões mais recentes do GWT (iniciando em 2.3 ou 2.4, acredito), você também pode adicionar

<collapse-all-properties />

para o seu gwt.xml para fins de desenvolvimento. Isso instruirá o compilador GWT a criar uma única permutação que cubra todos os códigos de idioma e navegadores. Portanto, você ainda pode testar em todos os navegadores e idiomas, mas ainda está compilando uma única permutação

Chi
fonte
2
Interessante ... qual é a desvantagem?
precisa
compilar uma permutação única que lida com todos os navegadores e idiomas ainda leva um pouco mais de tempo do que uma permutação única que lida com apenas um navegador e idioma, mas a diferença não é significativa na minha experiência. (~ Mais de 25% é o que eu estou vendo, mas que ainda é uma grande melhoria sobre a compilação de várias permutações)
Chi
Não consigo encontrar um link de documento para isso ... você pode criar um link para algo?
precisa
Embora essa tag acelere a compilação, também interrompe a depuração no modo Super Dev (pelo menos para 2.6). O código-fonte mostrado no depurador do Chrome difere do código js compilado. Então, quando eu coloco um ponto de interrupção em algum método java, o depurador para em outro método.
damluar
18

Você pode adicionar uma opção ao seu build para produção:

-localWorkers 8- Onde 8 é o número de threads simultâneos que calculam permutações. Tudo o que você precisa fazer é ajustar esse número para o número mais conveniente para você. Veja o desempenho da compilação GWT (graças ao comentário de Dennis Ich).

Se você estiver compilando no ambiente de teste, também poderá usar:

-draftCompile que permite compilações mais rápidas, mas menos otimizadas

-optimize 0 que não otimiza seu código (9 é o valor máximo de otimização)

Outra coisa que mais que dobrou o desempenho do modo de compilação e hospedado foi o uso de um disco SSD (agora o modo hospedado funciona como um encanto). Não é uma solução barata, mas, dependendo de quanto você usa o GWT e o custo do seu tempo, pode valer a pena!

Espero que isso ajude você!

martins.tuga
fonte
Definir trabalhadores locais para o número de núcleos pode ser muito improdutivo. Veja isto para referência: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich
Obrigado por você comentar Dennis. Na verdade, eu tenho um SSD e dou 2G de memória. É claro que o número de localWorker deve ser ajustado para cada caso, dependendo do número de permutações, núcleos, máquinas, etc ... No meu caso, quando estou compilando no meu laptop e quero navegar na Web, se deixe 2 núcleos livres. Isso é apenas um exemplo. No entanto, editarei minha postagem para incluir sua ideia. Obrigado.
martins.tuga
14

O compilador GWT está fazendo muitas análises de código, por isso será difícil acelerá-lo. Esta sessão do Google IO 2008 lhe dará uma boa idéia do que a GWT está fazendo e por que demora tanto.

Minha recomendação é que o desenvolvimento use o Modo Hospedado o máximo possível e, em seguida, compile apenas quando desejar fazer seus testes. Isso soa como a solução que você já encontrou, mas basicamente é por isso que o Hosted Mode está lá (bem, isso e depuração).

Você pode acelerar a compilação do GWT, mas apenas para alguns navegadores, em vez de 5 tipos que o GWT faz por padrão. Se você deseja usar o Modo Hospedado, compile por pelo menos dois navegadores; se você compilar para um único navegador, o código de detecção do navegador será otimizado e o Modo Hospedado não funcionará mais.

Uma maneira fácil de configurar a compilação para menos navegadores é criar um segundo módulo que herda do seu módulo principal:

<module rename-to="myproject">
  <inherits name="com.mycompany.MyProject"/>
  <!-- Compile for IE and Chrome -->
  <!-- If you compile for only one browser, the browser detection javascript
       is optimised away and then Hosted Mode doesn't work -->
  <set-property name="user.agent" value="ie6,safari"/>
</module>

Se o rename-toatributo for definido da mesma forma, os arquivos de saída serão os mesmos de uma compilação completa

Dave Webb
fonte
11
  • Divida seu aplicativo em vários módulos ou pontos de entrada e recompile somente quando necessário.
  • Analise seu aplicativo usando a versão do tronco - que fornece a História da sua compilação . Isso pode ou não ser relevante para o compilador 1.6, mas pode indicar o que está acontecendo.
Robert Munteanu
fonte
Vários pontos de entrada devem funcionar, mas não módulos, porque o GWT sempre verifica tudo conectado ao seu código e compila um resultado final monolítico. A estrutura do GWT é uma bagunça e uma desgraça para os princípios da modularidade. Não foi encontrado um bom projeto que reutilizou as coisas da estrutura do GWT.
user1050755
4

Para o GWT 2.x, descobri que se você usar

<set-property name="user.agent" value="ie6"/>
<extend-property values="ie8,gecko1_8" name="user.agent"/>

Você pode até especificar mais de uma permutação.

CCarpo
fonte