Nous commençons à utiliser davantage GWT dans nos projets et les performances du compilateur GWT deviennent de plus en plus gênantes.
Nous allons commencer à modifier nos méthodes de travail afin d'atténuer le problème, notamment en mettant davantage l'accent sur le navigateur en mode hébergé, ce qui permet de différer la nécessité d'exécuter le compilateur GWT à une date ultérieure, mais entraîne des risques propres, notamment ceux de ne pas déceler les problèmes avec les vrais navigateurs avant beaucoup plus tard que nous le souhaiterions.
Idéalement, nous aimerions rendre le compilateur GWT plus rapide lui-même - une minute pour compiler une application assez petite prend la pisse. Cependant, nous utilisons la compilation si elle est assez naïve. J'espère donc que nous pourrons réaliser des gains rapides et faciles.
Nous appelons actuellement com.google.gwt.dev.Compiler en tant qu'application Java à partir de la cible Ant, avec un segment de mémoire maximal de 256 m et beaucoup d'espace de pile. Le compilateur est lancé par Ant à l'aide de fork = true et le dernier Java 6 JRE, pour tirer parti des performances améliorées de Java6. Nous passons notre classe de contrôleurs principale au compilateur avec le chemin d'accès aux classes de l'application, et c'est parti.
Que pouvons-nous faire pour obtenir un peu plus de vitesse? Pouvons-nous lui donner plus d'informations pour qu'il passe moins de temps à découvrir ce qu'il faut faire?
Je sais que nous pouvons dire de ne compiler que pour un seul navigateur, mais nous devons faire des tests avec plusieurs navigateurs, ce qui n’est pas vraiment pratique.
Toutes les suggestions sont les bienvenues à ce stade.
Commençons par la vérité inconfortable: les performances du compilateur GWT sont vraiment médiocres. Vous pouvez utiliser quelques hacks ici et là, mais vous n'allez pas obtenir de meilleures performances.
Une bonne 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 en 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 utilisez uniquement un navigateur spécifique pour les tests, vous pouvez utiliser ce petit bidouillage.
Une autre option: si vous utilisez plusieurs locales et que vous n'en utilisez qu'une seule à des fins de test, vous pouvez toutes les commenter de sorte que GWT utilise la locale par défaut, ce qui réduit les frais généraux liés à la compilation.
En bout de ligne: vous n'allez pas obtenir une augmentation de l'ordre de grandeur des performances du compilateur, mais en prenant plusieurs relaxations, vous pouvez gagner quelques minutes ici et là.
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 multi-cœ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 le compilateur n'est pas nécessairement parallélisable), mais l'accélération reste notable si vous compilez plusieurs permutations.
Si vous souhaitez utiliser la version principale de GWT, vous pourrez utiliser le mode hébergé pour tous les navigateurs ( mode hébergé en dehors du processus ), ce qui atténue la plupart des problèmes actuels liés au mode hébergé. . Cela semble être la direction que prend le GWT - développez toujours avec le mode hébergé, car les compilations ne sont pas susceptibles d’atteindre des magnitudes plus rapidement.
Bien que cette entrée soit relativement ancienne et que la plupart d’entre vous le sachent probablement déjà, il est utile de mentionner que GWT 2.x inclut un nouvel indicateur de compilation qui accélère les compilations en ignorant les optimisations. Vous ne devez certainement pas déployer le code JavaScript ainsi compilé, mais cela peut vous faire gagner du temps lors de la construction continue en dehors de la production.
Il suffit d’ajouter l’indicateur: -draftCompile à la ligne du compilateur GWT.
Voici une liste de valeurs user.agent vous pouvez le définir.
(Ajouter ceci ici parce que je finis toujours ici quand je cherche ce que je devrais définir pour que cela ne produise qu'une permutation pour chrome. La réponse est: <set-property name="user.agent" value="safari"/>
)
Dans les nouvelles versions de GWT (à partir de la version 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 seule permutation couvrant tous les paramètres régionaux et tous les navigateurs. Par conséquent, vous pouvez toujours tester dans tous les navigateurs et dans toutes les langues, mais ne compilez toujours qu'une seule permutation.
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 performance de 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 maximale d'optimisation)
Une autre chose qui a plus que doublé les performances de construction et de mode hébergé a été l'utilisation d'un disque SSD (le mode hébergé fonctionne désormais à merveille). Ce n'est pas une solution bon marché, mais en fonction de votre utilisation de GWT et du coût de votre temps, cela peut en valoir la peine!
J'espère que cela vous aide!
Le compilateur GWT effectue 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 autant que possible le mode hébergé et ne compile ensuite que lorsque vous souhaitez effectuer vos tests. Cela ressemble à la solution à laquelle vous êtes déjà parvenu, mais en gros, c’est la raison pour laquelle le mode hébergé est là (bien, cela et le débogage).
Vous pouvez accélérer la compilation de GWT, mais uniquement pour certains navigateurs, au lieu de 5 types que GWT utilise 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 consiste à 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 la rename-to
attribut est défini de la même façon que les fichiers de sortie seront les mêmes que si vous aviez fait une compilation complète
Contrôler les permutations de compilation sera utile, veuillez suivre les liens suivants qui expliquent la même chose en détail:
Contrôle de l'explosion de permutation: ConditionalProperties
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 plus d'une permutation.