Comment accélérer le compilateur gwt?

201

Nous commençons à utiliser de plus en plus GWT dans nos projets, et les performances du compilateur GWT deviennent de plus en plus ennuyeuses.

Nous allons commencer à modifier nos pratiques de travail pour atténuer le problème, notamment en mettant davantage l'accent sur le navigateur en mode hébergé, qui reporte la nécessité d'exécuter le compilateur GWT jusqu'à une date ultérieure, mais cela comporte ses propres risques, en particulier celui de ne pas attraper de problèmes avec de vrais navigateurs jusqu'à bien plus tard que nous le souhaiterions.

Idéalement, nous aimerions rendre le compilateur GWT lui-même plus rapide - une minute pour compiler une application assez petite prend la pisse. Cependant, nous utilisons la compilation de façon assez naïve, donc j'espère que nous pourrons faire des gains rapides et faciles.

Nous invoquons actuellement com.google.gwt.dev.Compiler en tant qu'application java à partir de la cible Ant Ant, avec 256 m de tas maximum et beaucoup d'espace de pile. Le compilateur est lancé par Ant en utilisant fork = true et le dernier Java 6 JRE, pour essayer de profiter des performances améliorées de Java6. Nous passons notre classe de contrôleur principale au compilateur avec le chemin de classe de l'application, et c'est parti.

Que pouvons-nous faire d'autre pour obtenir une vitesse supplémentaire? Pouvons-nous lui donner plus d'informations pour qu'il passe moins de temps à découvrir quoi faire?

Je sais que nous pouvons lui dire de ne compiler que pour un seul navigateur, mais nous devons faire des tests multi-navigateurs, donc ce n'est pas vraiment pratique.

Toutes les suggestions sont les bienvenues à ce stade.

skaffman
la source

Réponses:

144

Commençons par la vérité inconfortable: les performances du compilateur GWT sont vraiment nulles. Vous pouvez utiliser des hacks ici et là, mais vous n'obtiendrez pas de meilleures performances.

Un bon hack de performance que vous pouvez faire est de compiler uniquement pour des navigateurs spécifiques, en insérant la ligne suivante dans votre gwt.xml:

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

ou dans la syntaxe gwt 2.x, et pour un seul navigateur:

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

Ceci, par exemple, compilera votre application pour IE et FF uniquement. Si vous savez que vous n'utilisez qu'un navigateur spécifique pour les tests, vous pouvez utiliser ce petit hack.

Une autre option: si vous utilisez plusieurs paramètres régionaux et que vous n'en utilisez à nouveau qu'un seul pour les tests, vous pouvez tous les commenter afin que GWT utilise les paramètres régionaux par défaut, ce qui réduit les frais généraux supplémentaires lors de la compilation.

Conclusion: vous n'obtiendrez pas d'augmentation de l'ordre de grandeur des performances du compilateur, mais en prenant plusieurs relâchements, vous pouvez vous raser quelques minutes ici et là.

Yuval Adam
la source
3
Il apparaît pour GWT 2.0, vous voulez que cette syntaxe spécifie un agent utilisateur: <set-property name = "user.agent" value = "gecko, gecko1_8" />
amarré le
Dans gwt 2.2, il n'y a pas de gecko. Le compilateur déclare que "La valeur gecko n'a pas été définie précédemment. Exception inattendue lors du traitement de l'élément 'set-property'"
uthark
définir la valeur sur "gecko1_8" uniquement devrait fonctionner pour Firefox 1.5 et versions ultérieures dans gwt 2.2
eaykin
Cette réponse a presque deux ans. N'hésitez pas à le modifier pour clarifier ce point.
Yuval Adam
6
2013, toujours le temps de compilation de GWT est nul, peut-on améliorer cette réponse pour, GWT 2.5
Forhad
62

Si vous exécutez le compilateur GWT avec l'indicateur -localWorkers, le compilateur compilera plusieurs permutations en parallèle. Cela vous permet d'utiliser tous les cœurs d'une machine multicœur, par exemple -localWorkers 2 indiquera au compilateur de compiler deux permutations en parallèle. Vous n'obtiendrez pas de différences d'ordre de grandeur (tout n'est pas parallélisable dans le compilateur) mais c'est toujours une accélération notable si vous compilez plusieurs permutations.

Si vous êtes prêt à utiliser la version tronc de GWT, vous pourrez utiliser le mode hébergé pour n'importe quel navigateur ( hors mode hébergé ), ce qui atténue la plupart des problèmes actuels avec le mode hébergé. Cela semble être là où va le GWT - développez toujours avec le mode hébergé, car les compilations ne sont pas susceptibles d'obtenir des amplitudes plus rapidement.

Chi
la source
2
Ah, l'option LocalWorkers est un joyau, qui mérite d'être connu. Malheureusement, la plupart de nos boîtes de développement sont des xeons à cœur unique. Cette OOPHM semble également très prometteuse. Toujours dans la prochaine version, c'est ...
skaffman
4
virtualiser un environnement de compilation sur une boîte avec plusieurs cœurs; à distance dans ce vm; exécuter la compilation GWT en ligne de commande en utilisant -localWorkers, avec un minimum de locals et user.agents; assurez-vous que le boîtier hébergeant le VM est un homologue réseau vers lequel vous effectuez le déploiement. La combinaison de ceci réduit votre compilation à environ 30 secondes avec déploiement dans tomcat. De plus, tout cela peut être écrit dans un script. Vous pouvez également développer sur une machine locale, créer un correctif svn et demander à votre script d'appliquer le correctif à l'aide d'un certain type de partage NFS ou samba, éliminant ainsi la nécessité de copier uniquement les différences src. Yay!
kr.
Le client NX est également un énorme +++ pour le développement à distance sur des connexions ADSL, câble ou WiFi limitées. De plus, vous êtes toujours synchronisé, peu importe la composition que vous utilisez à n'importe quel endroit avec Internet
kr.
par défaut, le nombre de CPU disponibles sur la plate-forme dans la version maven. Donc pas de vitesse ici pour moi.
keiki
55

Bien que cette entrée soit assez ancienne et que la plupart d'entre vous le sachent probablement déjà, je pense qu'il vaut la peine de mentionner que GWT 2.x inclut un nouvel indicateur de compilation qui accélère la compilation en ignorant les optimisations. Vous ne devez certainement pas déployer JavaScript compilé de cette façon, mais cela peut vous faire gagner du temps lors des builds continus hors production.

Incluez simplement le drapeau: -draftCompile dans votre ligne de compilateur GWT.

monzonj
la source
3
J'ai utilisé cette option, et dans notre projet, elle a parfois échoué avec une étrange erreur. Sachez donc que parfois la compilation peut ne pas fonctionner à cause de cela.
Vic
31

Voici une liste de valeurs user.agent que vous pouvez définir.

( L' ajout de ce ici parce que je continue à se retrouver ici quand je cherche ce que je dois mettre à faire produire seulement une permutation pour le chrome réponse est:. <set-property name="user.agent" value="safari"/>)

Stephen
la source
Où suis-je censé ajouter cet élément set-property? J'ai essayé de l'ajouter à l'intérieur et à l'extérieur de l'élément <module> dans mon fichier app.gwt.xml et cela ne fonctionne pas.
Alex Worden
Il va dans votre fichier ABC.gwt.xml de module où ABC est le nom de votre module.
Glenn
30

Dans les nouvelles versions de GWT (à partir de 2.3 ou 2.4, je crois), vous pouvez également ajouter

<collapse-all-properties />

à votre gwt.xml à des fins de développement. Cela indiquera au compilateur GWT de créer une permutation unique qui couvre tous les paramètres régionaux et les navigateurs. Par conséquent, vous pouvez toujours tester dans tous les navigateurs et langues, mais ne compilez toujours qu'une seule permutation

Chi
la source
2
Intéressant ... quel est l'inconvénient?
skaffman
compiler une permutation unique qui gère tous les navigateurs et langues prend encore un peu plus de temps qu'une permutation unique qui ne gère qu'un seul navigateur et langue, mais la différence n'est pas significative dans mon expérience. (~ 25% de plus, c'est ce que je vois, mais c'est toujours une énorme amélioration par rapport à la compilation de plusieurs permutations)
Chi
Je ne trouve pas de lien doc pour cela ... pouvez-vous créer un lien vers quelque chose?
skaffman
Bien que cette balise accélère la compilation, elle interrompt également le débogage en mode Super Dev (au moins pour 2.6). Le code source affiché dans le débogueur Chrome diffère du code js compilé. Ainsi, lorsque je mets un point d'arrêt dans une méthode java, le débogueur s'arrête dans une autre méthode.
damluar
18

Vous pouvez ajouter une option à votre build pour la production:

-localWorkers 8- Où 8 est le nombre de threads simultanés qui calculent les permutations. Tout ce que vous avez à faire est d'ajuster ce nombre au nombre qui vous convient le mieux. Voir les performances de la compilation GWT (grâce au commentaire de Dennis Ich).

Si vous compilez dans l'environnement de test, vous pouvez également utiliser:

-draftCompile qui permet des compilations plus rapides mais moins optimisées

-optimize 0 qui n'optimise pas votre code (9 est la valeur d'optimisation maximale)

Une autre chose qui a plus que doublé les performances de génération et de mode hébergé était l'utilisation d'un disque SSD (maintenant le mode hébergé fonctionne comme un charme). Ce n'est pas une solution bon marché, mais selon la façon dont vous utilisez GWT et le coût de votre temps, cela en vaut la peine!

J'espère que cela vous aide!

martins.tuga
la source
Définir les travailleurs locaux sur le nombre de cœurs peut être très improductif. Voir ceci pour référence: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich
Merci pour ton commentaire Dennis. En fait, j'ai un SSD et je donne 2 Go de mémoire. Bien sûr, le nombre de LocalWorker doit être ajusté à chaque cas, en fonction du nombre de permutations, de cœurs, de machine, etc. Dans mon cas, lorsque je compile sur mon ordinateur portable et que je souhaite naviguer sur le Web, si laissez 2 cœurs libres. Ce n'est qu'un exemple. Cependant, modifiera mon message pour inclure votre idée. Merci.
martins.tuga
14

Le compilateur GWT fait beaucoup d'analyse de code, il sera donc difficile de l'accélérer. Cette session de Google IO 2008 vous donnera une bonne idée de ce que fait GWT et pourquoi cela prend si longtemps.

Ma recommandation est que le développement utilise le mode hébergé autant que possible et ne compile que lorsque vous souhaitez effectuer vos tests. Cela ressemble à la solution que vous avez déjà trouvée, mais c'est essentiellement la raison pour laquelle le mode hébergé est là (enfin, cela et le débogage).

Vous pouvez accélérer la compilation de GWT, mais uniquement pour certains navigateurs, plutôt que 5 types que GWT fait par défaut. Si vous souhaitez utiliser le mode hébergé, assurez-vous de compiler pour au moins deux navigateurs; si vous compilez pour un seul navigateur, le code de détection du navigateur est optimisé et le mode hébergé ne fonctionne plus.

Un moyen simple de configurer la compilation pour moins de navigateurs est de créer un deuxième module qui hérite de votre module 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>

Si l' rename-toattribut est défini de la même manière, les fichiers de sortie seront les mêmes que si vous avez effectué une compilation complète

Dave Webb
la source
11
  • Divisez votre application en plusieurs modules ou points d'entrée et recompilez ensuite uniquement lorsque cela est nécessaire.
  • Analysez votre application à l'aide de la version trunk - qui fournit l' histoire de votre compilation . Cela peut être pertinent ou non pour le compilateur 1.6 mais cela peut indiquer ce qui se passe.
Robert Munteanu
la source
Plusieurs points d'entrée devraient fonctionner, mais pas les modules, car GWT vérifie toujours tout ce qui est connecté à votre code et compile un résultat final monolithique. Le cadre GWT est un gâchis et une honte pour les principes de modularité. Je n'ai pas trouvé un bon projet qui a réutilisé les trucs du framework GWT.
user1050755
4

Pour GWT 2.x, je viens de découvrir que si vous utilisez

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

Vous pouvez même spécifier plusieurs permutations.

CCarpo
la source