Gwt derleyicisini nasıl hızlandırabilirim?


201

Projelerimizde GWT'yi daha yoğun kullanmaya başlıyoruz ve GWT derleyicisinin performansı giderek sinir bozucu hale geliyor.

Barındırılan mod tarayıcıya daha büyük bir vurgu da dahil olmak üzere, GWT derleyicisini daha sonraki bir zamana kadar çalıştırma ihtiyacını karşılayan sorunu azaltmak için çalışma uygulamalarımızı değiştirmeye başlayacağız, ancak bu özellikle istediğimizden daha geç olana kadar gerçek tarayıcılarla ilgili sorunları yakalamamak.

İdeal olarak, GWT derleyicisinin kendisini daha hızlı hale getirmek istiyoruz - oldukça küçük bir uygulamayı derlemek için bir dakika işemek alıyor. Ancak, derleme oldukça naif bir moda kullanıyoruz, bu yüzden hızlı ve kolay kazançlar sağlayabileceğimizi umuyorum.

Şu anda com.google.gwt.dev.Compiler'i 256m maksimum yığın ve yığın alanı ile ant Ant hedefinden bir java uygulaması olarak çağırıyoruz. Derleyici, Java6'nın gelişmiş performansından yararlanmak için fork = true ve en son Java 6 JRE kullanılarak Ant tarafından başlatılır. Ana kontrolör sınıfımızı uygulama sınıfyoluyla birlikte derleyiciye geçiriyoruz ve gidiyor.

Ekstra hız elde etmek için başka ne yapabiliriz? Daha fazla bilgi verebilir miyiz, böylece ne yapacağımızı keşfetmeye daha az zaman harcar mı?

Yalnızca bir tarayıcı için derlemesini söyleyebileceğimizi biliyorum, ancak çoklu tarayıcı testi yapmamız gerekiyor, bu yüzden bu gerçekten pratik değil.

Tüm öneriler bu noktada memnuniyetle karşılanmaktadır.

Yanıtlar:


144

Rahatsız edici gerçekle başlayalım: GWT derleyici performansı gerçekten berbat. Burada ve orada bazı hack'ler kullanabilirsiniz, ancak önemli ölçüde daha iyi performans elde edemezsiniz.

Yapabileceğiniz güzel bir performans hacki, aşağıdaki satırı ekleyerek yalnızca belirli tarayıcılar için derlemektir gwt.xml:

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

veya gwt 2.x sözdiziminde ve yalnızca bir tarayıcı için:

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

Bu, örneğin, başvurunuzu yalnızca IE ve FF için derleyecektir. Test için yalnızca belirli bir tarayıcı kullandığınızı biliyorsanız, bu küçük hack'i kullanabilirsiniz.

Başka bir seçenek: birden fazla yerel ayar kullanıyorsanız ve tekrar test için yalnızca bir tane kullanıyorsanız, GWT'nin varsayılan yerel ayarı kullanması için hepsini yorumlayabilirsiniz, bu, derleme zamanından ek bir ek yük çıkarır.

Alt satır: derleyici performansında büyüklük sırası artışı elde etmeyeceksiniz, ancak birkaç gevşeme alarak, burada ve orada birkaç dakika tıraş edebilirsiniz.


3
GWT 2.0 için görünüyor, aslında bu sözdiziminin bir kullanıcı aracısı belirtmesini istiyorsunuz: <set-property name = "user.agent" value = "gecko, gecko1_8" />
1'de demirliyor

Gwt 2.2'de kertenkele yoktur. Derleyici "değer gecko daha önce tanımlanmadı." Set-property 'öğesi işlenirken beklenmeyen bir istisna "
uthark

değeri "gecko1_8" olarak ayarlamak yalnızca Firefox 1.5 ve sonraki sürümler için gwt 2.2'de çalışmalıdır
eaykin

Bu cevap neredeyse iki yaşında. Bu noktayı açıklığa kavuşturmak için düzenlemekten çekinmeyin.
Yuval Adam

6
2013, hala GWT derleme zamanı berbat herhangi biri bu cevabı geliştirebilir, GWT 2.5
Forhad

62

GWT derleyicisini -localWorkers bayrağıyla çalıştırırsanız, derleyici birden çok permütasyonu paralel olarak derler. Bu, çok çekirdekli bir makinenin tüm çekirdeklerini kullanmanıza izin verir, örneğin -localWorkers 2, derleyiciye paralel olarak iki permütasyon derlemesini söyleyecektir. Büyüklük farklarının sırasını elde edemezsiniz (derleyicideki her şey paralelleştirilemez), ancak birden fazla permütasyon derliyorsanız hala fark edilir bir hızlanmadır.

GWT'nin gövde sürümünü kullanmak istiyorsanız, barındırılan moddaki mevcut sorunların çoğunu azaltan herhangi bir tarayıcı ( barındırılan işlem dışı mod ) için barındırılan modu kullanabilirsiniz. GWT'nin gittiği yer bu gibi görünüyor - derlenenler her zaman barındırılan mod ile gelişiyor, çünkü derlemelerin büyüklükleri daha hızlı alması muhtemel değil.


2
Ah, localWorkers seçeneği bilmeye değer bir mücevher olduğunu. Ne yazık ki, geliştirici kutularımızın çoğu tek çekirdekli xeon'lardır. OOFHM de çok umut verici görünüyor. Her zaman bir sonraki versiyonda, bu ...
skaffman

4
birden çok çekirdekli bir kutu üzerinde bir derleme ortamını sanallaştırmak; uzaktan bu vm içine; -localWorkers kullanarak, en az yerel ayar ve user.agents kullanarak komut satırı GWT derlemesini yürütün; vm'yi barındıran kutunun, dağıttığınız yere bir ağ eşi olduğundan emin olun. Bunun birleşimi, derlemenizi tomcat'te konuşlandırıldığında yaklaşık 30 saniyeye indirir. Ayrıca tüm bunlar bir senaryoda yazılabilir. Ayrıca, yerel bir makinede geliştirebilir, bir svn yaması oluşturabilir ve komut dosyanızın bir tür NFS veya samba paylaşımı kullanarak yamayı uygulamasını sağlayarak, yalnızca src diffs'nin üzerine kopyalama ihtiyacını ortadan kaldırabilirsiniz. Yaşasın!
kr.

NX istemcisi ayrıca sınırlı ADSL, Kablo veya WiFi bağlantılarında uzaktan geliştirme için büyük bir +++. Artı her zaman w / internet herhangi bir yerde kullanarak ne zorunlu olursa olsun senkronize edilmiş
kr.

maven derlemesinde platformda kullanılabilir CPU sayısı varsayılan olarak ayarlanmıştır. Yani benim için hızlanma.
keiki

55

Bu giriş oldukça eski olmasına rağmen ve çoğunuz muhtemelen zaten biliyor olsa da, GWT 2.x'in optimizasyonları atlayarak derlemeleri hızlandıran yeni bir derleme bayrağı içerdiğini belirtmek gerekir. Bu şekilde derlenmiş JavaScript'i kesinlikle dağıtmamalısınız, ancak üretim dışı sürekli derlemeler sırasında zaman tasarrufu sağlayabilir.

GwT derleyici satırınıza flag: -draftCompile öğesini eklemeniz yeterlidir.


3
Bu seçeneği kullandım ve projemizde bazen garip bir hatayla başarısız oldu. Bu nedenle bazen derlemenin işe yaramayabileceğini unutmayın.
Vic

31

User.agent değerlerinin listesi size ayarlayabileceğiniz .

(Ben sadece krom için bir permütasyon üreten yapmak için belirlesin aradıkları burada noktalandık tutmak çünkü burada bu ekleme Cevap geçerli:. <set-property name="user.agent" value="safari"/>)


Bu set özelliği öğesini nereye eklemem gerekiyor? Benim app.gwt.xml dosyasında <module> öğesinin içine ve dışına eklemeyi denedim ve çalışmıyor.
Alex Worden

ABC modülünüzün olduğu ABC.gwt.xml modülüne gider.
Glenn

30

GWT'nin yeni sürümlerinde (2.3 veya 2.4'ten başlayarak, inanıyorum), ayrıca

<collapse-all-properties />

geliştirme amacıyla gwt.xml'nize. Bu, GWT derleyicisine tüm yerel ayarları ve tarayıcıları kapsayan tek bir permütasyon oluşturmasını söyleyecektir. Bu nedenle, yine de tüm tarayıcılarda ve dillerde test edebilirsiniz, ancak yine de yalnızca tek bir permütasyon derliyorsunuz


2
İlginç ... dezavantajı nedir?
skaffman

tüm tarayıcıları ve dilleri işleyen tek bir permütasyon derlemek, sadece bir tarayıcı ve dili işleyen tek bir permütasyondan biraz daha fazla zaman alır, ancak deneyimimde fark önemli değildir. (~% 25 daha fazla gördüğüm, ama bu hala birden fazla permütasyon derleme üzerinde büyük bir gelişme)
Chi

Bunun için doc bağlantısı bulamıyorum ... bir şeye bağlantı verebilir misiniz?
skaffman

Bu etiket derlemeyi hızlandırsa da, Süper Geliştirme Modunda hata ayıklamayı da kırıyor (en azından 2.6 için). Krom hata ayıklayıcısında gösterilen kaynak kodu derlenmiş js kodundan farklı. Bu yüzden bazı java yönteminde bir kesme noktası koymak, hata ayıklayıcı başka bir yöntemde durur.
damluar

18

Üretim için yapınıza bir seçenek ekleyebilirsiniz:

-localWorkers 8- Burada 8, permütasyonları hesaplayan eşzamanlı evre sayısıdır. Tek yapmanız gereken bu sayıyı sizin için daha uygun olan sayıya ayarlamaktır. GWT derleme performansına bakın (Dennis Ich yorumu sayesinde).

Test ortamını derliyorsanız aşağıdakileri de kullanabilirsiniz:

-draftCompile daha hızlı, ancak daha az optimize edilmiş derlemeler sağlar

-optimize 0 kodunuzu optimize etmeyen (9 maksimum optimizasyon değeridir)

Yapı ve barındırılan mod performansını iki kattan fazla artıran bir başka şey de SSD diskin kullanılmasıydı (şimdi hostedmode bir cazibe gibi çalışıyor). Ucuz bir çözüm değildir, ancak GWT'yi ne kadar kullandığınıza ve zamanınızın maliyetine bağlı olarak buna değebilir!

Umarım bu size yardımcı olur!


Yerel işçileri çekirdek sayısına ayarlamak çok verimsiz olabilir. Referans için bakınız: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich

Yorumunuz için teşekkürler Dennis. Aslında, bir SSD'm var ve 2G bellek veriyorum. Tabii ki, permütasyonların, çekirdeklerin, makinelerin vb. Sayısına bağlı olarak localWorker sayısının her bir duruma göre ayarlanması gerekir ... Benim durumumda, dizüstü bilgisayarımda derlediğimde ve web'de gezinmek istediğimde, 2 çekirdeği boş bırakın. Bu sadece bir örnek. Ancak, gönderimi fikrinizi içerecek şekilde düzenleyecektir. Teşekkürler.
martins.tuga

14

GWT derleyicisi çok fazla kod analizi yapıyor, bu yüzden hızlandırmak zor olacak. Google IO 2008'den bu oturum size GWT'nin ne yaptığı ve neden bu kadar uzun sürdüğü hakkında iyi bir fikir verecektir.

Tavsiyem geliştirme için Barındırılan Modu mümkün olduğunca kullanın ve sonra yalnızca testinizi yapmak istediğinizde derleyin. Bu, şimdiye kadar geldiğiniz çözüm gibi geliyor, ancak temelde Barındırılan Mod orada (iyi, bu ve hata ayıklama).

GWT derlemesini hızlandırabilirsiniz, ancak GWT'nin varsayılan olarak yaptığı 5 tür yerine yalnızca bazı tarayıcılar için derleme yapabilirsiniz. Barındırılan Modu kullanmak istiyorsanız, en az iki tarayıcı için derlediğinizden emin olun; tek bir tarayıcı için derlerseniz, tarayıcı algılama kodu optimize edilir ve Barındırılan Mod artık çalışmaz.

Daha az tarayıcı için derlemeyi yapılandırmanın kolay bir yolu, ana modülünüzden devralan ikinci bir modül oluşturmaktır:

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

Eğer rename-tonitelik aynı ayarlanır Tam bir derleme yaptım sanki o çıktı dosyaları aynı olacaktır


11
  • Uygulamanızı birden fazla modüle veya giriş noktasına ayırın ve yalnızca gerektiğinde yeniden derleyin.
  • Derlemenizin Öyküsünü sağlayan gövde sürümünü kullanarak uygulamanızı analiz edin . Bu 1.6 derleyicisiyle ilgili olabilir veya olmayabilir, ancak neler olduğunu gösterebilir.

Birden fazla giriş noktası çalışmalı, ancak modüller olmamalıdır, çünkü GWT her zaman kodunuza bağlı olan her şeyi kontrol eder ve yekpare bir sonuç derler. GWT çerçevesi bir karmaşa ve modülerlik ilkelerine utançtır. GWT çerçeve öğelerini yeniden kullanan iyi bir proje bulamadık.
user1050755

4

GWT 2.x için şunu kullanırdım:

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

Birden fazla permütasyon bile belirleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.