Bagaimana cara mempercepat kompiler gwt?

201

Kami mulai menggunakan GWT lebih berat dalam proyek kami, dan kinerja kompiler GWT menjadi semakin menjengkelkan.

Kami akan mulai mengubah praktik kerja kami untuk mengurangi masalah, termasuk penekanan yang lebih besar pada browser mode yang di-host, yang menghalangi kebutuhan untuk menjalankan kompiler GWT hingga waktu mendatang, tetapi itu membawa risiko sendiri, terutama dari tidak menangkap masalah dengan peramban asli hingga lebih lama dari yang kami inginkan.

Idealnya, kami ingin membuat kompiler GWT sendiri lebih cepat - satu menit untuk mengkompilasi aplikasi yang cukup kecil adalah mengambil kencing. Namun, kami menggunakan kompilasi jika mode yang cukup naif, jadi saya berharap kami dapat membuat beberapa keuntungan cepat dan mudah.

Kami saat ini menggunakan com.google.gwt.dev.Compiler sebagai aplikasi java dari target Ant semut, dengan tumpukan maksimum 256m dan banyak ruang tumpukan. Kompiler diluncurkan oleh Ant menggunakan fork = true dan Java 6 JRE terbaru, untuk mencoba dan memanfaatkan peningkatan kinerja Java6. Kami melewati kelas pengontrol utama kami ke kompilator bersama dengan classpath aplikasi, dan segera pergi.

Apa lagi yang bisa kita lakukan untuk mendapatkan kecepatan ekstra? Bisakah kita memberikan lebih banyak informasi sehingga lebih sedikit menghabiskan waktu untuk menemukan apa yang harus dilakukan?

Saya tahu kita bisa mengatakannya hanya untuk kompilasi untuk satu browser, tetapi kita perlu melakukan pengujian multi-browser, jadi itu tidak terlalu praktis.

Semua saran diterima pada saat ini.

skaffman
sumber

Jawaban:

144

Mari kita mulai dengan kebenaran yang tidak nyaman: Kinerja kompiler GWT benar-benar buruk. Anda dapat menggunakan beberapa peretasan di sana-sini, tetapi Anda tidak akan mendapatkan kinerja yang jauh lebih baik.

Peretasan kinerja yang bagus yang dapat Anda lakukan adalah mengkompilasi hanya untuk peramban tertentu, dengan memasukkan baris berikut di gwt.xml:

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

atau dalam sintaks gwt 2.x, dan hanya untuk satu browser:

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

Misalnya, ini akan mengkompilasi aplikasi Anda untuk IE dan FF saja. Jika Anda tahu Anda hanya menggunakan browser khusus untuk pengujian, Anda dapat menggunakan hack kecil ini.

Opsi lain: jika Anda menggunakan beberapa lokal, dan sekali lagi hanya menggunakan satu untuk pengujian, Anda dapat berkomentar semuanya sehingga GWT akan menggunakan lokal default, ini memotong beberapa overhead tambahan dari waktu kompilasi.

Intinya: Anda tidak akan mendapatkan peningkatan urutan kinerja compiler, tetapi mengambil beberapa relaksasi, Anda dapat mencukur beberapa menit di sana-sini.

Yuval Adam
sumber
3
Tampaknya untuk GWT 2.0, Anda sebenarnya ingin sintaks ini menentukan agen pengguna: <set-property name = "user.agent" value = "gecko, gecko1_8" />
mooreds
Di gwt 2.2 tidak ada tokek. Compiler menyatakan bahwa "Nilai tokek tidak ditentukan sebelumnya. Pengecualian tak terduga saat memproses elemen 'set-property'"
uthark
mengatur nilai ke "gecko1_8" hanya akan berfungsi untuk Firefox 1.5 dan yang lebih baru di gwt 2.2
eaykin
Jawaban ini hampir dua tahun. Jangan ragu untuk mengeditnya untuk memperjelas hal ini.
Yuval Adam
6
2013, masih waktu kompilasi GWT menyebalkan dapat siapa pun meningkatkan jawaban ini untuk, GWT 2.5
Forhad
62

Jika Anda menjalankan kompiler GWT dengan flag -localWorkers, kompiler akan mengkompilasi beberapa permutasi secara paralel. Ini memungkinkan Anda menggunakan semua inti dari mesin multi-core, misalnya -localWorkers 2 akan memberi tahu kompiler untuk melakukan kompilasi dua permutasi secara paralel. Anda tidak akan mendapatkan urutan perbedaan magnitudo (tidak semua yang ada di kompiler dapat diparalelkan) tetapi masih merupakan speedup yang nyata jika Anda mengkompilasi beberapa permutasi.

Jika Anda bersedia menggunakan versi trunk GWT, Anda akan dapat menggunakan mode host untuk browser apa pun (di luar mode host proses ), yang meringankan sebagian besar masalah saat ini dengan mode host. Itu tampaknya menjadi tujuan GWT - selalu berkembang dengan mode yang dihosting, karena kompilasi tidak mungkin mendapatkan besaran lebih cepat.

Chi
sumber
2
Ah, opsi localWorkers adalah permata, itu pantas diketahui. Sayangnya, sebagian besar kotak dev kami adalah xeon inti tunggal. OOPHM itu terlihat sangat menjanjikan juga. Selalu dalam versi berikutnya, itu adalah ...
#
4
virtualisasikan lingkungan kompilasi pada sebuah kotak dengan banyak inti; jauh ke vm ini; mengeksekusi baris perintah kompilasi GWT menggunakan -localWorkers, dengan penduduk lokal dan user.agents minimal; pastikan kotak hosting vm adalah rekan jaringan ke tempat Anda menyebarkan. Kombinasi ini membuat kompilasi Anda menjadi sekitar 30 detik dengan penyebaran di kucing jantan. Selain itu semua ini dapat ditulis dalam naskah. Anda juga dapat menggunakan mesin lokal, membuat tambalan svn, dan meminta skrip menerapkan tambalan menggunakan beberapa jenis NFS atau berbagi samba, sehingga tidak perlu menyalin hanya dengan src diff. yay!
kr.
Klien NX juga merupakan +++ besar untuk pengembang jarak jauh pada ADSL terbatas, kabel, atau koneksi WiFi. Plus, Anda selalu sinkron, apa pun yang Anda gunakan di lokasi apa pun dengan internet
kr.
default ke platform jumlah CPU yang tersedia di maven build. Jadi tidak ada kecepatan di sini untukku.
keiki
55

Meskipun entri ini sudah cukup lama dan sebagian besar dari Anda mungkin sudah tahu, saya pikir layak menyebutkan bahwa GWT 2.x menyertakan flag kompilasi baru yang mempercepat kompilasi dengan melewatkan optimisasi. Anda seharusnya tidak menggunakan JavaScript yang dikompilasi dengan cara itu, tetapi itu bisa menghemat waktu selama pembuatan berkelanjutan non-produksi.

Cukup sertakan flag: -draftCompile ke baris kompiler GWT Anda.

Monzonj
sumber
3
Saya menggunakan opsi itu, dan dalam proyek kami terkadang gagal dengan kesalahan aneh. Jadi berhati-hatilah, bahwa kadang-kadang kompilasi mungkin tidak berhasil karena ini.
Vic
31

Berikut adalah daftar nilai user.agent yang bisa Anda atur.

(Menambahkan ini di sini karena saya terus berada di sini ketika saya mencari apa yang harus saya set untuk membuatnya hanya menghasilkan permutasi untuk chrome. Jawabannya adalah <set-property name="user.agent" value="safari"/>:)

Stephen
sumber
Di mana saya harus menambahkan elemen properti set ini? Saya sudah mencoba menambahkannya di dalam dan di luar elemen <module> di file app.gwt.xml saya dan tidak berfungsi.
Alex Worden
Ini masuk dalam file modul ABC.gwt.xml Anda di mana ABC adalah nama modul Anda.
Glenn
30

Di versi GWT yang lebih baru (mulai 2.3 atau 2.4, saya percaya), Anda juga dapat menambahkan

<collapse-all-properties />

ke gwt.xml Anda untuk tujuan pengembangan. Itu akan memberi tahu kompiler GWT untuk membuat permutasi tunggal yang mencakup semua lokal dan browser. Oleh karena itu, Anda masih dapat menguji di semua browser dan bahasa, tetapi masih hanya mengkompilasi permutasi tunggal

Chi
sumber
2
Menarik ... apa kerugiannya?
skaffman
mengkompilasi permutasi tunggal yang menangani semua browser dan bahasa masih membutuhkan waktu sedikit lebih banyak daripada permutasi tunggal yang hanya menangani satu browser dan bahasa, tetapi perbedaannya tidak signifikan dalam pengalaman saya. (~ 25% lebih banyak yang saya lihat, tapi itu masih merupakan peningkatan besar dalam mengkompilasi beberapa permutasi)
Chi
Saya tidak dapat menemukan tautan dokumen untuk ini ... dapatkah Anda menautkan ke sesuatu?
skaffman
Meskipun tag ini mempercepat kompilasi, namun juga debugging dalam Mode Super Dev (setidaknya untuk 2,6). Kode sumber yang ditunjukkan dalam debugger krom berbeda dari kode js yang dikompilasi. Jadi ketika saya meletakkan breakpoint di beberapa metode java, debugger berhenti di metode lain.
damluar
18

Anda dapat menambahkan satu opsi ke bangunan Anda untuk produksi:

-localWorkers 8- Dimana 8 adalah jumlah utas bersamaan yang menghitung permutasi. Yang harus Anda lakukan adalah menyesuaikan nomor ini dengan nomor yang lebih nyaman bagi Anda. Lihat kinerja kompilasi GWT (terima kasih atas komentar Dennis Ich).

Jika Anda mengkompilasi ke lingkungan pengujian, Anda juga dapat menggunakan:

-draftCompile yang memungkinkan kompilasi yang lebih cepat, tetapi kurang dioptimalkan

-optimize 0 yang tidak mengoptimalkan kode Anda (9 adalah nilai optimalisasi maks)

Hal lain yang lebih dari dua kali lipat kinerja build dan mode host adalah penggunaan disk SSD (sekarang hostmode bekerja seperti pesona). Ini bukan solusi yang murah, tetapi tergantung pada seberapa banyak Anda menggunakan GWT dan biaya waktu Anda, itu mungkin sepadan!

Semoga ini bisa membantu Anda!

martins.tuga
sumber
Menetapkan pekerja lokal ke jumlah inti bisa sangat tidak produktif. Lihat ini untuk referensi: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich
Terima kasih atas komentar Anda, Dennis. Sebenarnya, saya punya SSD dan memberikan memori 2G. Tentu saja jumlah pekerja lokal harus disetel untuk setiap kasus, tergantung pada jumlah permutasi, inti, mesin, dll ... Dalam kasus saya, ketika saya sedang menyusun pada laptop saya dan ingin menavigasi di web, jika biarkan 2 core gratis. Itu hanya sebuah contoh. Namun, akan mengedit posting saya untuk memasukkan ide Anda. Terima kasih.
martins.tuga
14

Kompiler GWT sedang melakukan banyak analisis kode sehingga akan sulit untuk mempercepatnya. Sesi ini dari Google IO 2008 akan memberi Anda ide bagus tentang apa yang GWT lakukan dan mengapa itu memakan waktu begitu lama.

Rekomendasi saya adalah untuk pengembangan, gunakan Mode Host sebanyak mungkin dan kemudian hanya kompilasi ketika Anda ingin melakukan pengujian. Ini memang terdengar seperti solusi yang sudah Anda datangi, tetapi pada dasarnya itu sebabnya Mode Hosted ada di sana (baik, itu dan debugging).

Anda dapat mempercepat kompilasi GWT tetapi hanya mengkompilasi untuk beberapa browser, daripada 5 jenis yang GWT lakukan secara default. Jika Anda ingin menggunakan Mode Hosted, pastikan Anda mengkompilasi setidaknya dua browser; jika Anda mengkompilasi untuk satu browser maka kode deteksi browser dioptimalkan dan Mode Hosted tidak berfungsi lagi.

Cara mudah untuk mengonfigurasi kompilasi untuk browser yang lebih sedikit adalah dengan membuat modul kedua yang diwarisi dari modul utama Anda:

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

Jika rename-toatribut diatur sama maka file output akan sama seperti jika Anda melakukan kompilasi penuh

Dave Webb
sumber
11
  • Pisahkan aplikasi Anda menjadi beberapa modul atau titik masuk dan kompilasi ulang hanya saat diperlukan.
  • Analisis aplikasi Anda menggunakan versi trunk - yang menyediakan Kisah kompilasi Anda . Ini mungkin atau mungkin tidak relevan dengan kompiler 1.6 tetapi dapat menunjukkan apa yang terjadi.
Robert Munteanu
sumber
Beberapa titik masuk harus berfungsi, tetapi bukan modul karena GWT selalu memeriksa segala sesuatu yang terhubung ke kode Anda dan mengkompilasi hasil akhir yang monolitik. Kerangka kerja GWT berantakan dan memalukan bagi prinsip-prinsip modularitas. Tidak menemukan satu proyek bagus yang menggunakan kembali kerangka kerja GWT.
user1050755
4

Untuk GWT 2.x saya baru menemukan itu jika Anda gunakan

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

Anda bahkan dapat menentukan lebih dari satu permutasi.

CCarpo
sumber