Jak przyspieszyć kompilator gwt?

201

Zaczynamy intensywniej wykorzystywać GWT w naszych projektach, a wydajność kompilatora GWT staje się coraz bardziej irytująca.

Zaczniemy zmieniać nasze praktyki robocze w celu złagodzenia problemu, w tym większy nacisk na przeglądarkę trybu hostowanego, która odracza potrzebę uruchamiania kompilatora GWT do późniejszego czasu, ale wiąże się to z własnym ryzykiem, szczególnie z ryzykiem nie wychwytuje problemów z prawdziwymi przeglądarkami dużo później niż byśmy tego chcieli.

Idealnie byłoby, gdyby sam kompilator GWT był szybszy - wystarczy chwilę, aby skompilować dość małą aplikację. Używamy jednak kompilacji, jeśli jest to dość naiwny sposób, więc mam nadzieję, że uda nam się szybko i łatwo osiągnąć korzyści.

Obecnie przywołujemy com.google.gwt.dev.Compiler jako aplikację Java z docelowego obiektu Ant Ant z maksymalną stertą 256 m i dużą ilością miejsca na stosie. Kompilator jest uruchamiany przez Ant przy użyciu fork = true i najnowszej wersji JRE Java 6, aby skorzystać z lepszej wydajności Java6. Przekazujemy naszą główną klasę kontrolera do kompilatora wraz ze ścieżką klasy aplikacji i jest wyłączona.

Co jeszcze możemy zrobić, aby uzyskać dodatkową prędkość? Czy możemy podać mu więcej informacji, aby mniej czasu poświęcił na odkrycie, co robić?

Wiem, że możemy powiedzieć, aby kompilowała się tylko dla jednej przeglądarki, ale musimy przeprowadzić testy dla wielu przeglądarek, więc to nie jest tak naprawdę praktyczne.

Wszystkie sugestie są mile widziane w tym miejscu.

skaffman
źródło

Odpowiedzi:

144

Zacznijmy od niewygodnej prawdy: wydajność kompilatora GWT jest naprawdę kiepska. Możesz użyć niektórych hacków tu i tam, ale nie uzyskasz znacznie lepszej wydajności.

Niezły hack wydajnościowy, jaki możesz zrobić, to skompilować tylko dla określonych przeglądarek, wstawiając następujący wiersz w gwt.xml:

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

lub w składni gwt 2.x i tylko dla jednej przeglądarki:

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

To na przykład skompiluje twoją aplikację tylko dla IE i FF. Jeśli wiesz, że do testowania używasz tylko określonej przeglądarki, możesz użyć tego małego hacka.

Inna opcja: jeśli używasz kilku ustawień regionalnych i ponownie używasz tylko jednego do testowania, możesz je wszystkie skomentować, aby GWT używał domyślnych ustawień narodowych, co zmniejsza dodatkowe koszty związane z kompilacją.

Podsumowując: nie uzyskasz wzrostu wydajności kompilatora o rząd wielkości, ale biorąc kilka relaksacji, możesz się ogolić kilka minut tu i tam.

Yuval Adam
źródło
3
Wygląda na to, że dla GWT 2.0, naprawdę chcesz, aby ta składnia określała agenta użytkownika: <set-property name = "user.agent" value = "gecko, gecko1_8" />
zacumowane
W GWT 2.2 nie ma gekona. Kompilator stwierdza, że ​​„Wartość gekon nie została wcześniej zdefiniowana. Nieoczekiwany wyjątek podczas przetwarzania elementu„ set-property ””
uthark
ustawienie wartości na „gecko1_8” powinno działać tylko w przeglądarce Firefox 1.5 i nowszych w wersji gwt 2.2
eaykin,
Ta odpowiedź ma prawie dwa lata. Możesz go edytować, aby wyjaśnić ten punkt.
Yuval Adam
6
2013, wciąż czas kompilacji GWT jest do bani, każdy może poprawić tę odpowiedź, GWT 2.5
Forhad 27.04.13
62

Jeśli uruchomisz kompilator GWT z flagą -localWorkers, kompilator skompiluje wiele permutacji równolegle. Pozwala to na użycie wszystkich rdzeni maszyny wielordzeniowej, na przykład -localWorkers 2 powie kompilatorowi, aby skompilował dwie permutacje równolegle. Nie dostaniesz różnic rzędu wielkości (nie wszystko w kompilatorze można zrównoleglać), ale nadal jest zauważalne przyspieszenie, jeśli kompilujesz wiele permutacji.

Jeśli chcesz korzystać z wersji łącza GWT, możesz używać trybu hostowanego dla dowolnej przeglądarki ( poza hostowanym trybem hostowanym ), co łagodzi większość bieżących problemów z trybem hostowanym. Wydaje się, że właśnie tam zmierza GWT - zawsze rozwijaj w trybie hostowanym, ponieważ kompilacje prawdopodobnie nie będą szybciej uzyskiwać wielkości.

Chi
źródło
2
Ach, opcja localWorkers to klejnot, który warto wiedzieć. Niestety, większość naszych pudełek deweloperów to xeony jednordzeniowe. To, że OOPHM też wygląda bardzo obiecująco. Zawsze w następnej wersji jest ...
skaffman,
4
wirtualizacja środowiska kompilacji na pudełku z wieloma rdzeniami; zdalnie do tego vm; uruchom kompilację GWT z wiersza poleceń, używając opcji -localWorkers, z minimalną liczbą lokalnych użytkowników i user.agents; upewnij się, że urządzenie hostujące maszynę wirtualną to równorzędny element sieci do miejsca, w którym wdrażasz. Kombinacja tego powoduje kompilację do około 30 sekund w / wdrożenie w tomcat. Ponadto wszystko to można zapisać w skrypcie. Możesz także napisać na komputerze lokalnym, utworzyć łatkę svn i poprosić skrypt o zastosowanie poprawki przy użyciu pewnego rodzaju udostępniania NFS lub samby, eliminując potrzebę kopiowania tylko różnic src. tak!
kr.
Klient NX to także ogromny +++ dla zdalnych programistów na ograniczonych połączeniach ADSL, kablowych lub WiFi. Dodatkowo zawsze jesteś w synchronizacji, bez względu na to, jakiego komputera używasz w dowolnym miejscu w / internet
kr.
domyślnie jest dostępna platforma dla procesorów w wersji maven. Więc nie ma tu dla mnie przyspieszenia.
keiki,
55

Chociaż ten wpis jest dość stary i większość z was prawdopodobnie już wie, myślę, że warto wspomnieć, że GWT 2.x zawiera nową flagę kompilacji, która przyspiesza kompilacje poprzez pomijanie optymalizacji. Zdecydowanie nie powinieneś instalować JavaScript skompilowanego w ten sposób, ale może to być oszczędność czasu podczas ciągłych kompilacji nieprodukcyjnych.

Wystarczy dołączyć flagę: -draftCompile do linii kompilatora GWT.

monzonj
źródło
3
Skorzystałem z tej opcji, aw naszym projekcie czasami zawiodła z dziwnym błędem. Pamiętaj więc, że czasami kompilacja może nie działać z tego powodu.
Vic
31

Oto lista wartości user.agent, które możesz ustawić na.

(W tym miejscu dodać, bo utrzymanie kończący się tutaj podczas wyszukiwania, co mam ustawić, aby produkować tylko permutacji dla Chrome Odpowiedź brzmi:. <set-property name="user.agent" value="safari"/>)

Stephen
źródło
Gdzie mam dodać ten element zestawu właściwości? Próbowałem dodać go wewnątrz i na zewnątrz elementu <module> w moim pliku app.gwt.xml i nie działa.
Alex Worden
Znajduje się w pliku modułu ABC.gwt.xml, gdzie ABC jest nazwą modułu.
Glenn
30

W nowszych wersjach GWT (jak sądzę, począwszy od wersji 2.3 lub 2.4) można również dodać

<collapse-all-properties />

na gwt.xml w celach programistycznych. Dzięki temu kompilator GWT utworzy jedną permutację, która obejmie wszystkie ustawienia narodowe i przeglądarki. Dlatego nadal możesz testować we wszystkich przeglądarkach i językach, ale nadal kompilujesz tylko jedną permutację

Chi
źródło
2
Ciekawe ... co jest wadą?
skaffman
skompilowanie pojedynczej permutacji, która obsługuje wszystkie przeglądarki i języki, wciąż zajmuje nieco więcej czasu niż pojedynczej permutacji, która obsługuje tylko jedną przeglądarkę i język, ale z mojego doświadczenia ta różnica nie jest znacząca. (~ 25% więcej jest tym, co widzę, ale to wciąż ogromna poprawa w porównaniu do kompilacji wielu permutacji)
Chi
Nie mogę znaleźć linku do dokumentu w tym celu ... czy możesz coś z tym połączyć?
skaffman
Chociaż ten znacznik przyspiesza kompilację, przerywa także debugowanie w trybie Super Dev (przynajmniej dla wersji 2.6). Kod źródłowy wyświetlany w debuggerze chrome różni się od skompilowanego kodu js. Więc kiedy wstawiam punkt przerwania w jakiejś metodzie Java, debugger zatrzymuje się w innej metodzie.
damluar,
18

Możesz dodać jedną opcję do swojej kompilacji do produkcji:

-localWorkers 8- gdzie 8 to liczba współbieżnych wątków, które obliczają permutacje. Wszystko, co musisz zrobić, to dostosować ten numer do liczby, która będzie dla Ciebie wygodniejsza. Zobacz wydajność kompilacji GWT (dzięki komentarzowi Dennisa Ich).

Jeśli kompilujesz się w środowisku testowym, możesz także użyć:

-draftCompile co umożliwia szybsze, ale mniej zoptymalizowane kompilacje

-optimize 0 co nie optymalizuje kodu (9 to maksymalna wartość optymalizacji)

Kolejną rzeczą, która ponad dwukrotnie zwiększyła wydajność kompilacji i trybu hostowanego, było użycie dysku SSD (teraz tryb hostowany działa jak urok). To nie jest tanie rozwiązanie, ale w zależności od tego, ile korzystasz z GWT i kosztu twojego czasu, może być tego warte!

Mam nadzieję, że to ci pomoże!

martins.tuga
źródło
Ustawienie lokalnych pracowników na liczbę rdzeni może być bardzo nieproduktywne. Zobacz to w celach informacyjnych: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich
Dziękuję za komentarz Dennis. Właściwie mam dysk SSD i daję 2G pamięci. Oczywiście, że liczba localWorkera musi być dostosowana do każdej sprawy, w zależności od liczby permutacji, rdzeni, maszyny itp. ... W moim przypadku, kiedy kompiluję na swoim laptopie i chcę nawigować w Internecie, jeśli zostaw 2 rdzenie wolne. To tylko przykład. Jednak zmodyfikuję mój post, aby uwzględnić Twój pomysł. Dzięki.
martins.tuga
14

Kompilator GWT przeprowadza wiele analiz kodu, więc przyspieszenie będzie trudne. Ta sesja od Google IO 2008 da ci dobre wyobrażenie o tym, co robi GWT i dlaczego trwa tak długo.

Moje zalecenie dotyczy programowania w jak największym stopniu używaj trybu hostowanego, a następnie kompiluj tylko wtedy, gdy chcesz przeprowadzić testowanie. To brzmi jak rozwiązanie, które już przyszedłeś, ale w zasadzie właśnie dlatego istnieje Tryb Hostowany (cóż, to i debugowanie).

Możesz przyspieszyć kompilację GWT, ale tylko kompilację dla niektórych przeglądarek, zamiast 5 rodzajów, które GWT domyślnie robi. Jeśli chcesz korzystać z trybu hostowanego, upewnij się, że kompilujesz dla co najmniej dwóch przeglądarek; jeśli kompilujesz dla jednej przeglądarki, kod wykrywania przeglądarki jest optymalizowany, a następnie Tryb hostowany już nie działa.

Prostym sposobem na skonfigurowanie kompilacji dla mniejszej liczby przeglądarek jest utworzenie drugiego modułu, który dziedziczy z głównego modułu:

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

Jeśli rename-toatrybut jest ustawiony tak samo, pliki wyjściowe będą takie same, jakbyś zrobił pełną kompilację

Dave Webb
źródło
11
  • Podziel aplikację na wiele modułów lub punktów wejścia i ponownie skompiluj tylko wtedy, gdy zajdzie taka potrzeba.
  • Przeanalizuj swoją aplikację za pomocą wersji trunk - która zapewnia historię twojej kompilacji . To może, ale nie musi być istotne dla kompilatora 1.6, ale może wskazywać, co się dzieje.
Robert Munteanu
źródło
Powinno działać wiele punktów wejścia, ale nie modułów, ponieważ GWT zawsze sprawdza wszystko podłączone do twojego kodu i kompiluje monolityczny wynik końcowy. Struktura GWT to bałagan i hańba dla zasad modułowości. Nie znalazłem jednego dobrego projektu, który ponownie wykorzystywał frameworki GWT.
user1050755
4

W przypadku GWT 2.x właśnie odkryłem, że jeśli używasz

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

Możesz nawet podać więcej niż jedną permutację.

CCarpo
źródło