Wie beschleunige ich den GWT-Compiler?

201

Wir beginnen, GWT in unseren Projekten stärker zu nutzen, und die Leistung des GWT-Compilers wird zunehmend ärgerlich.

Wir werden anfangen, unsere Arbeitspraktiken zu ändern, um das Problem zu mindern, einschließlich einer stärkeren Betonung des Browsers im gehosteten Modus, der die Notwendigkeit verzögert, den GWT-Compiler bis zu einem späteren Zeitpunkt auszuführen, aber dies birgt seine eigenen Risiken, insbesondere die von Probleme mit echten Browsern erst viel später als wir möchten.

Idealerweise möchten wir den GWT-Compiler selbst schneller machen - eine Minute zum Kompilieren einer relativ kleinen Anwendung ist pissig. Wir verwenden die Kompilierung jedoch ziemlich naiv, daher hoffe ich, dass wir schnell und einfach Gewinne erzielen können.

Wir rufen derzeit com.google.gwt.dev.Compiler als Java-Anwendung von Ant Ant Target mit maximal 256 m Heap und viel Stapelspeicher auf. Der Compiler wird von Ant mit fork = true und der neuesten Java 6 JRE gestartet, um die verbesserte Leistung von Java6 zu nutzen. Wir übergeben unsere Hauptcontrollerklasse zusammen mit dem Anwendungsklassenpfad an den Compiler und los geht's.

Was können wir noch tun, um zusätzliche Geschwindigkeit zu erreichen? Können wir ihm mehr Informationen geben, damit er weniger Zeit damit verbringt, herauszufinden, was zu tun ist?

Ich weiß, wir können es nur für einen Browser kompilieren, aber wir müssen Tests mit mehreren Browsern durchführen, das ist also nicht wirklich praktisch.

Alle Vorschläge sind an dieser Stelle willkommen.

Skaffman
quelle

Antworten:

144

Beginnen wir mit der unangenehmen Wahrheit: Die Leistung des GWT-Compilers ist wirklich mies. Sie können hier und da einige Hacks verwenden, aber Sie werden keine wesentlich bessere Leistung erzielen.

Ein guter Performance-Hack, den Sie ausführen können, besteht darin, nur für bestimmte Browser zu kompilieren, indem Sie die folgende Zeile in Ihre einfügen gwt.xml:

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

oder in gwt 2.x-Syntax und nur für einen Browser:

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

Dies kompiliert beispielsweise Ihre Anwendung nur für IE und FF. Wenn Sie wissen, dass Sie nur einen bestimmten Browser zum Testen verwenden, können Sie diesen kleinen Hack verwenden.

Eine weitere Option: Wenn Sie mehrere Gebietsschemas verwenden und erneut nur eines zum Testen verwenden, können Sie sie alle auskommentieren, damit GWT das Standardgebietsschema verwendet. Dies spart zusätzlichen Aufwand durch die Kompilierungszeit.

Fazit: Sie werden die Compiler-Leistung nicht um eine Größenordnung steigern, aber wenn Sie mehrere Entspannungen vornehmen, können Sie sich hier und da ein paar Minuten Zeit lassen.

Yuval Adam
quelle
3
Es scheint für GWT 2.0, Sie möchten tatsächlich, dass diese Syntax einen Benutzeragenten angibt: <set-property name = "user.agent" value = "gecko, gecko1_8" />
festgemacht
In GWT 2.2 gibt es keinen Gecko. Der Compiler gibt an, dass "der Wert gecko zuvor nicht definiert wurde. Unerwartete Ausnahme bei der Verarbeitung des Elements 'set-property'"
uthark
Das Setzen des Wertes auf "gecko1_8" sollte nur für Firefox 1.5 und höher in GWT 2.2
eaykin
Diese Antwort ist fast zwei Jahre alt. Fühlen Sie sich frei, es zu bearbeiten, um diesen Punkt zu verdeutlichen.
Yuval Adam
6
2013, noch GWT Kompilierungszeit saugt kann jemand diese Antwort verbessern, für GWT 2.5
Forhad
62

Wenn Sie den GWT-Compiler mit dem Flag -localWorkers ausführen, kompiliert der Compiler mehrere Permutationen parallel. Auf diese Weise können Sie alle Kerne eines Multi-Core-Computers verwenden. Beispiel: -localWorkers 2 weist den Compiler an, zwei Permutationen parallel zu kompilieren. Sie erhalten keine Größenordnungsunterschiede (nicht alles im Compiler ist parallelisierbar), aber es ist immer noch eine spürbare Beschleunigung, wenn Sie mehrere Permutationen kompilieren.

Wenn Sie bereit sind, die Trunk-Version von GWT zu verwenden, können Sie den gehosteten Modus für jeden Browser verwenden ( außer Prozess gehosteter Modus ), wodurch die meisten aktuellen Probleme mit dem gehosteten Modus behoben werden. Das scheint der Punkt zu sein, an dem sich die GWT bewegt - entwickeln Sie sich immer im gehosteten Modus, da Kompilierungen wahrscheinlich nicht schneller werden.

Chi
quelle
2
Ah, die Option localWorkers ist ein Juwel, das es wert ist, gewusst zu werden. Leider sind die meisten unserer Entwicklungsboxen Single-Core-Xeons. Das OOPHM sieht auch sehr vielversprechend aus. Immer in der nächsten Version ist es ...
Skaffman
4
Virtualisieren Sie eine Kompilierungsumgebung auf einer Box mit mehreren Kernen. fern in diese vm; Führen Sie die Befehlszeilen-GWT-Kompilierung mit -localWorkers mit minimalen lokalen und user.agents aus. Stellen Sie sicher, dass die Box, auf der sich die VM befindet, ein Netzwerk-Peer zu dem Ort ist, an dem Sie die Bereitstellung durchführen. Durch diese Kombination wird Ihre Kompilierung auf ca. 30 Sekunden mit Bereitstellung in Tomcat reduziert. Darüber hinaus kann all dies in einem Skript geschrieben werden. Sie können auch auf einem lokalen Computer entwickeln, einen SVN-Patch erstellen und Ihr Patch den Patch mithilfe einer Art NFS- oder Samba-Freigabe anwenden lassen, sodass Sie nicht nur die src-Unterschiede kopieren müssen. Yay!
kr.
Der NX-Client ist auch ein riesiges +++ für Remote-Entwickler mit eingeschränkten ADSL-, Kabel- oder WiFi-Verbindungen. Außerdem sind Sie immer synchron, egal welche Komposition Sie an einem beliebigen Ort mit Internet verwenden
kr.
Standardmäßig wird die verfügbare Anzahl von CPUs auf der Plattform im Maven-Build verwendet. Also keine Beschleunigung hier für mich.
Keiki
55

Obwohl dieser Eintrag ziemlich alt ist und die meisten von Ihnen wahrscheinlich bereits wissen, ist es erwähnenswert, dass GWT 2.x ein neues Kompilierungsflag enthält, das das Kompilieren beschleunigt, indem Optimierungen übersprungen werden. Sie sollten JavaScript, das auf diese Weise kompiliert wurde, definitiv nicht bereitstellen, aber es kann eine Zeitersparnis bei kontinuierlichen Builds ohne Produktion sein.

Fügen Sie einfach das Flag: -draftCompile in Ihre GWT-Compilerzeile ein.

monzonj
quelle
3
Ich habe diese Option verwendet und in unserem Projekt ist sie manchmal mit einem seltsamen Fehler fehlgeschlagen. Beachten Sie also, dass die Kompilierung aus diesem Grund manchmal nicht funktioniert.
Vic
31

Hier ist eine Liste der user.agent-Werte, auf die Sie sie festlegen können.

(Addiert man diese hier , weil ich immer endet hier, wenn ich für die Suche , was ich einstellen sollte es nur eine Permutation für Chrom produzieren machen Antwort ist:. <set-property name="user.agent" value="safari"/>)

Stephen
quelle
Wo soll ich dieses Set-Property-Element hinzufügen? Ich habe versucht, es innerhalb und außerhalb des <module> -Elements in meiner app.gwt.xml-Datei hinzuzufügen, aber es funktioniert nicht.
Alex Worden
Es befindet sich in Ihrer Moduldatei ABC.gwt.xml, wobei ABC Ihr Modulname ist.
Glenn
30

In den neueren Versionen von GWT (ab 2.3 oder 2.4, glaube ich) können Sie auch hinzufügen

<collapse-all-properties />

zu Entwicklungszwecken in Ihre gwt.xml. Dadurch wird der GWT-Compiler angewiesen, eine einzelne Permutation zu erstellen, die alle Gebietsschemas und Browser abdeckt. Daher können Sie weiterhin in allen Browsern und Sprachen testen, kompilieren jedoch immer noch nur eine einzige Permutation

Chi
quelle
2
Interessant ... was ist der Nachteil?
Skaffman
Das Kompilieren einer einzelnen Permutation, die alle Browser und Sprachen verarbeitet, dauert immer noch etwas länger als eine einzelne Permutation, die nur einen Browser und eine Sprache verarbeitet, aber der Unterschied ist meiner Erfahrung nach nicht signifikant. (~ 25% mehr ist das, was ich sehe, aber das ist immer noch eine enorme Verbesserung gegenüber dem Kompilieren mehrerer Permutationen)
Chi
Ich kann keinen Dokumentlink dafür finden ... können Sie auf etwas verlinken?
Skaffman
Obwohl dieses Tag die Kompilierung beschleunigt, unterbricht es auch das Debuggen im Super Dev-Modus (zumindest für 2.6). Der im Chrome-Debugger angezeigte Quellcode unterscheidet sich vom kompilierten JS-Code. Wenn ich also einen Haltepunkt in eine Java-Methode setze, stoppt der Debugger in einer anderen Methode.
Damluar
18

Sie können Ihrem Build eine Option für die Produktion hinzufügen:

-localWorkers 8- Wobei 8 die Anzahl der gleichzeitigen Threads ist, die Permutationen berechnen. Alles, was Sie tun müssen, ist, diese Nummer an die Nummer anzupassen, die für Sie bequemer ist. Siehe GWT-Kompilierungsleistung (dank Dennis Ich-Kommentar).

Wenn Sie in die Testumgebung kompilieren, können Sie auch Folgendes verwenden:

-draftCompile Dies ermöglicht schnellere, aber weniger optimierte Kompilierungen

-optimize 0 Dies optimiert Ihren Code nicht (9 ist der maximale Optimierungswert).

Eine andere Sache, die die Leistung im Build- und Hosted-Modus mehr als verdoppelte, war die Verwendung einer SSD-Festplatte (jetzt funktioniert der Hosted-Modus wie ein Zauber). Es ist keine billige Lösung, aber je nachdem, wie viel Sie GWT verwenden und wie viel Zeit Sie dafür aufwenden, kann es sich lohnen!

Hoffe das hilft dir!

martins.tuga
quelle
Das Einstellen lokaler Arbeiter auf die Anzahl der Kerne kann sehr unproduktiv sein. Siehe dies als Referenz: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich
Danke für deinen Kommentar Dennis. Eigentlich habe ich eine SSD und gebe 2G Speicher. Natürlich muss die Anzahl der localWorker auf jeden Fall abgestimmt werden, abhängig von der Anzahl der Permutationen, Kerne, Maschinen usw. In meinem Fall, wenn ich auf meinem Laptop kompiliere und im Web navigieren möchte, wenn Lassen Sie 2 Kerne frei. Das ist nur ein Beispiel. Ich werde meinen Beitrag jedoch so bearbeiten, dass er Ihre Idee enthält. Vielen Dank.
martins.tuga
14

Der GWT-Compiler führt eine Menge Code-Analysen durch, daher wird es schwierig sein, diese zu beschleunigen. Diese Sitzung von Google IO 2008 gibt Ihnen eine gute Vorstellung davon, was GWT tut und warum es so lange dauert.

Meine Empfehlung ist, für die Entwicklung den Hosted-Modus so weit wie möglich zu verwenden und dann nur dann zu kompilieren, wenn Sie Ihre Tests durchführen möchten. Das klingt nach der Lösung, zu der Sie bereits gekommen sind, aber im Grunde ist das der Grund, warum der gehostete Modus da ist (nun, das und das Debuggen).

Sie können die GWT-Kompilierung beschleunigen, jedoch nur für einige Browser kompilieren, anstatt für 5 Arten, die GWT standardmäßig ausführt. Wenn Sie den gehosteten Modus verwenden möchten, stellen Sie sicher, dass Sie für mindestens zwei Browser kompilieren. Wenn Sie für einen einzelnen Browser kompilieren, wird der Browsererkennungscode entfernt und der gehostete Modus funktioniert nicht mehr.

Eine einfache Möglichkeit, das Kompilieren für weniger Browser zu konfigurieren, besteht darin, ein zweites Modul zu erstellen, das von Ihrem Hauptmodul erbt:

<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>

Wenn das rename-toAttribut gleich festgelegt ist, sind die Ausgabedateien dieselben wie bei einer vollständigen Kompilierung

Dave Webb
quelle
11
  • Teilen Sie Ihre Anwendung in mehrere Module oder Einstiegspunkte auf und kompilieren Sie sie nur bei Bedarf neu.
  • Analysieren Sie Ihre Anwendung mit der Trunk-Version, die die Story Ihrer Kompilierung enthält . Dies kann für den 1.6-Compiler relevant sein oder auch nicht, aber es kann anzeigen, was los ist.
Robert Munteanu
quelle
Es sollten mehrere Einstiegspunkte funktionieren, jedoch keine Module, da GWT immer alles überprüft, was mit Ihrem Code verbunden ist, und ein monolithisches Endergebnis erstellt. Das GWT-Framework ist ein Chaos und eine Schande für die Modularitätsprinzipien. Ich habe kein gutes Projekt gefunden, bei dem GWT-Framework-Inhalte wiederverwendet wurden.
user1050755
4

Für GWT 2.x habe ich das gerade entdeckt, wenn Sie verwenden

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

Sie können sogar mehr als eine Permutation angeben.

CCarpo
quelle