Come posso velocizzare il compilatore gwt?


201

Stiamo iniziando a utilizzare maggiormente GWT nei nostri progetti e le prestazioni del compilatore GWT stanno diventando sempre più fastidiose.

Inizieremo a modificare le nostre pratiche di lavoro per mitigare il problema, inclusa una maggiore enfasi sul browser in modalità hosted, che difende la necessità di eseguire il compilatore GWT in un secondo momento, ma ciò comporta i suoi rischi, in particolare quello di non riscontrare problemi con i browser reali fino a molto più tardi di quanto vorremmo.

Idealmente, vorremmo rendere il compilatore GWT stesso più veloce: un minuto per compilare un'applicazione abbastanza piccola sta facendo incazzare. Tuttavia, stiamo usando la compilazione se una moda abbastanza ingenua, quindi spero che possiamo ottenere alcuni guadagni facili e veloci.

Al momento stiamo invocando com.google.gwt.dev.Compiler come applicazione java da destinazione Ant Ant, con un heap massimo di 256 m e un sacco di spazio per lo stack. Il compilatore viene lanciato da Ant usando fork = true e l'ultimo Java 6 JRE, per cercare di sfruttare le prestazioni migliorate di Java6. Passiamo la nostra classe di controller principale al compilatore insieme al percorso di classe dell'applicazione e il gioco è fatto.

Cos'altro possiamo fare per ottenere una maggiore velocità? Possiamo dargli più informazioni in modo che passi meno tempo a scoprire cosa fare?

So che possiamo dirlo di compilare solo per un browser, ma dobbiamo fare test multi-browser, quindi non è molto pratico.

Tutti i suggerimenti sono benvenuti a questo punto.

Risposte:


144

Cominciamo con la scomoda verità: le prestazioni del compilatore GWT sono davvero pessime. Puoi usare alcuni hack qua e là, ma non otterrai prestazioni significativamente migliori.

Un bel trucco per le prestazioni che puoi fare è compilare solo per browser specifici, inserendo la seguente riga nel tuo gwt.xml:

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

o nella sintassi di gwt 2.x e per un solo browser:

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

Questo, ad esempio, compilerà la tua applicazione solo per IE e FF. Se sai che stai utilizzando solo un browser specifico per i test, puoi usare questo piccolo trucco.

Un'altra opzione: se si utilizzano più versioni locali e si utilizza di nuovo solo una per i test, è possibile commentarle tutte in modo che GWT utilizzerà le impostazioni internazionali predefinite, in modo da eliminare un sovraccarico aggiuntivo dal momento della compilazione.

In conclusione: non si otterrà un aumento dell'ordine delle dimensioni delle prestazioni del compilatore, ma prendendo diversi rilassamenti, è possibile radersi qualche minuto qua e là.


3
Sembra per GWT 2.0, in realtà vuoi che questa sintassi specifichi un agente utente: <set-property name = "user.agent" value = "gecko, gecko1_8" />
ormeggiati il

In gwt 2.2 non c'è geco. Il compilatore afferma che "Il valore geco non era stato precedentemente definito. Eccezione imprevista durante l'elaborazione dell'elemento 'set-property'"
uthark

l'impostazione del valore su "gecko1_8" dovrebbe funzionare solo per Firefox 1.5 e versioni successive in gwt 2.2
eaykin,

Questa risposta ha quasi due anni. Sentiti libero di modificarlo per chiarire questo punto.
Yuval Adam,

6
2013, il tempo di compilazione GWT fa ancora schifo per chiunque può migliorare questa risposta, GWT 2.5
Forhad

62

Se si esegue il compilatore GWT con il flag -localWorkers, il compilatore compilerà più permutazioni in parallelo. Ciò consente di utilizzare tutti i core di una macchina multi-core, ad esempio -localWorkers 2 dirà al compilatore di compilare due permutazioni in parallelo. Non otterrai differenze di ordine di grandezza (non tutto nel compilatore è parallelizzabile) ma è comunque un notevole aumento di velocità se stai compilando più permutazioni.

Se sei disposto a utilizzare la versione trunk di GWT, sarai in grado di utilizzare la modalità ospitata per qualsiasi browser ( modalità ospitata fuori processo ), che allevia la maggior parte dei problemi attuali con la modalità ospitata. Questo sembra essere il punto in cui sta andando il GWT - si sviluppa sempre con la modalità host, poiché è probabile che le compilazioni non ottengano dimensioni più rapidamente.


2
Ah, l'opzione localWorkers è un gioiello, vale la pena conoscerlo. Purtroppo, la maggior parte delle nostre scatole di sviluppo sono xe single-core. Anche questo OOPHM sembra molto promettente. Sempre nella prossima versione, è ...
Skaffman,

4
virtualizzare un ambiente di compilazione su una scatola con più core; remoto in questo vm; eseguire la compilazione GWT della riga di comando utilizzando -localWorkers, con i locali minimi e user.agents; assicurati che la casella che ospita vm sia un peer di rete su cui stai eseguendo la distribuzione. La combinazione di questo porta la compilazione a circa 30 secondi con dispiegamento in Tomcat. Inoltre, tutto ciò può essere scritto in uno script. Puoi anche sviluppare su un computer locale, creare una patch svn e fare in modo che lo script applichi la patch utilizzando un tipo di condivisione NFS o samba, eliminando la necessità di copiare solo le differenze src. Sìì!
kr.

Il client NX è anche un enorme +++ per sviluppatori remoti su connessioni ADSL, via cavo o WiFi limitate. Inoltre, sei sempre sincronizzato, indipendentemente da ciò che stai utilizzando in qualsiasi posizione con internet
kr.

per impostazione predefinita è disponibile il numero di CPU disponibili nella piattaforma maven build. Quindi nessuna velocità qui per me.
keiki

55

Sebbene questa voce sia piuttosto vecchia e probabilmente molti di voi già lo sanno, penso che valga la pena menzionare che GWT 2.x include un nuovo flag di compilazione che accelera le compilazioni saltando le ottimizzazioni. Non dovresti assolutamente distribuire JavaScript compilato in questo modo, ma può essere un risparmio di tempo durante le build continue non di produzione.

Includi solo il flag: -draftCompile alla tua linea di compilatore GWT.


3
Ho usato questa opzione e nel nostro progetto a volte falliva con uno strano errore. Quindi, tieni presente che a volte la compilazione potrebbe non funzionare a causa di ciò.
Vic

31

Ecco un elenco di valori user.agent su cui puoi impostarlo.

(L'aggiunta di questo qui perché continuo a finire qui quando cerco quello che devo impostare per renderlo solo produrre una permutazione per Chrome La risposta è:. <set-property name="user.agent" value="safari"/>)


Dove dovrei aggiungere questo elemento set-property? Ho provato ad aggiungerlo all'interno e all'esterno dell'elemento <module> nel mio file app.gwt.xml e non funziona.
Alex Worden,

Si trova nel file ABC.gwt.xml del modulo in cui ABC è il nome del modulo.
Glenn,

30

Nelle nuove versioni di GWT (a partire dalla 2.3 o 2.4, credo), puoi anche aggiungere

<collapse-all-properties />

al tuo gwt.xml per scopi di sviluppo. Ciò dirà al compilatore GWT di creare una singola permutazione che copre tutte le localizzazioni e i browser. Pertanto, puoi ancora testare in tutti i browser e tutte le lingue, ma stai ancora compilando una sola permutazione


2
Interessante ... qual è il rovescio della medaglia?
Skaffman,

la compilazione di una singola permutazione che gestisce tutti i browser e le lingue richiede ancora un po 'più di tempo rispetto a una singola permutazione che gestisce solo un browser e una lingua, ma la differenza non è significativa nella mia esperienza. (~ 25% in più è quello che sto vedendo, ma è comunque un enorme miglioramento rispetto alla compilazione di più permutazioni)
Chi

Non riesco a trovare un link doc per questo ... puoi linkare qualcosa?
Skaffman,

Sebbene questo tag acceleri la compilazione, interrompe anche il debug in modalità Super Dev (almeno per 2.6). Il codice sorgente mostrato nel debugger di Chrome differisce dal codice js compilato. Quindi, quando inserisco un punto di interruzione in un metodo Java, il debugger si interrompe in un altro metodo.
damluar,

18

Puoi aggiungere un'opzione alla tua build per la produzione:

-localWorkers 8- Dove 8 è il numero di thread simultanei che calcolano le permutazioni. Tutto quello che devi fare è regolare questo numero sul numero che ti è più comodo. Guarda le performance della compilation GWT (grazie al commento di Dennis Ich).

Se si sta compilando per l'ambiente di test, è anche possibile utilizzare:

-draftCompile che consente compilazioni più veloci, ma meno ottimizzate

-optimize 0 che non ottimizza il tuo codice (9 è il valore massimo di ottimizzazione)

Un'altra cosa che ha più che raddoppiato le prestazioni della modalità build e hosted è stata l'uso di un disco SSD (ora la modalità hosted funziona come un incantesimo). Non è una soluzione economica, ma a seconda di quanto usi GWT e del costo del tuo tempo, può valerne la pena!

Spero che questo ti aiuti!


Impostare i lavoratori locali sul numero di core può essere molto improduttivo. Vedi questo per riferimento: josephmarques.wordpress.com/2010/07/30/…
Dennis Ich

Grazie per il tuo commento Dennis. In realtà, ho un SSD e do 2G di memoria. Ovviamente il numero di localWorker deve essere regolato su ciascun caso, a seconda del numero di permutazioni, core, macchina, ecc ... Nel mio caso, quando sto compilando sul mio laptop e voglio navigare sul web, se lasciare liberi 2 core. Questo è solo un esempio. Tuttavia, modificherò il mio post per includere la tua idea. Grazie.
martins.tuga,

14

Il compilatore GWT sta eseguendo molte analisi del codice, quindi sarà difficile accelerarlo. Questa sessione di Google IO 2008 ti darà una buona idea di ciò che GWT sta facendo e del perché impiega così tanto tempo.

La mia raccomandazione è per lo sviluppo di utilizzare la modalità ospitata il più possibile e quindi compilare solo quando si desidera eseguire i test. Questa suona come la soluzione a cui sei già arrivato, ma fondamentalmente è per questo che c'è la modalità Hosted (beh, quella e il debug).

Puoi velocizzare la compilazione GWT ma compilando solo per alcuni browser, piuttosto che 5 tipi che GWT fa di default. Se si desidera utilizzare la modalità Hosted, assicurarsi di compilare per almeno due browser; se si compila per un singolo browser, il codice di rilevamento del browser viene ottimizzato e la modalità Hosted non funziona più.

Un modo semplice per configurare la compilazione per un minor numero di browser è quello di creare un secondo modulo che eredita dal tuo modulo principale:

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

Se l' rename-toattributo è impostato allo stesso modo, i file di output saranno gli stessi di una compilazione completa


11
  • Dividi l'applicazione in più moduli o punti di ingresso e ricompila solo quando necessario.
  • Analizza la tua applicazione usando la versione trunk - che fornisce la storia della tua compilazione . Questo può o meno essere rilevante per il compilatore 1.6 ma può indicare cosa sta succedendo.

Dovrebbero funzionare più punti di ingresso, ma non moduli perché GWT controlla sempre tutto ciò che è collegato al codice e compila un risultato finale monolitico. Il framework GWT è un disastro e una vergogna per i principi di modularità. Non ho trovato un buon progetto che ha riutilizzato le cose del framework GWT.
user1050755,

4

Per GWT 2.x ho appena scoperto che se lo usi

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

Puoi anche specificare più di una permutazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.