2009-06-18 2 views
189

Stiamo iniziando a fare un uso più pesante di GWT nei nostri progetti e le prestazioni del compilatore GWT stanno diventando sempre più fastidiose.Come velocizzare il compilatore gwt?

Iniziamo a modificare i nostri metodi di lavoro per mitigare il problema, includendo una maggiore enfasi sul browser in modalità host, che non consente di eseguire il compilatore GWT in un secondo momento, ma che comporta i propri rischi , in particolare quello di non prendere 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 prendendo il culo. Tuttavia, stiamo usando la compilazione se in modo abbastanza ingenuo, quindi spero che potremo fare alcuni guadagni facili e veloci.

Attualmente stiamo invocando com.google.gwt.dev.Compiler come applicazione java dalla destinazione ant Ant, con un massimo di 256 m di heap e molto spazio nello stack. Il compilatore viene lanciato da Ant usando fork = true e l'ultimo Java 6 JRE, per cercare di sfruttare le migliori prestazioni di Java6. Passiamo la nostra classe di controller principale al compilatore insieme al classpath dell'applicazione, e così via.

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

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

Tutti i suggerimenti sono benvenuti a questo punto.

risposta

137

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

Una bella prestazione hackerare si può fare è di compilare per i browser solo specifici, inserendo la seguente riga nel gwt.xml:

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

o nella sintassi 2.x GWT, e per un solo browser:

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

Questo, ad esempio, compilerà l'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 sta utilizzando diversi locali, e solo uno per il test usando ancora, tutti si può commentare in modo che GWT utilizzerà la lingua di default, questo rade certo overhead aggiuntivo dal momento della compilazione.

In conclusione: non si otterrà un aumento dell'ordine di grandezza delle prestazioni del compilatore, ma con diversi rilasci, è possibile radere alcuni minuti qua e là.

+3

Sembra per GWT 2.0, si vuole realmente questa sintassi per specificare un user agent: \t In – mooreds

+0

GWT 2.2 non c'è geco . Il compilatore afferma che "Il valore gecko non è stato definito in precedenza. Un'eccezione imprevista durante l'elaborazione dell'elemento 'set-property'" – uthark

+0

impostando il valore su "gecko1_8" dovrebbe funzionare solo per Firefox 1.5 e versioni successive in gwt 2.2 – eaykin

14

Il compilatore GWT sta eseguendo molte analisi del codice, quindi sarà difficile accelerarlo. This session from Google IO 2008 ti darà una buona idea di cosa GWT sta facendo e perché ci vuole così tanto tempo.

La mia raccomandazione è per lo sviluppo di utilizzare la modalità Hosted il più possibile e quindi compilare solo quando si desidera eseguire i test. Sembra la soluzione a cui sei già arrivato, ma in fondo è per questo che la modalità Hosted è lì (beh, quella e il debug).

È possibile velocizzare la compilazione GWT, ma compilando solo alcuni browser, anziché 5 tipi che GWT esegue per impostazione predefinita. Se vuoi usare la modalità Hosted assicurati di compilare almeno due browser; se si compila per un singolo browser, il codice di rilevamento del browser viene ottimizzato e quindi la modalità Hosted non funziona più.

Un modo semplice per configurare la compilazione di un minor numero di browser è quello di creare un secondo modulo che eredita dal 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'attributo rename-to è impostato lo stesso, allora i file di output sarà uguale a se hai eseguito una compilazione completa

10
  • Dividi l'applicazione in più moduli o punti di ingresso e ricompila poi solo quando necessario.
  • Analizza l'applicazione utilizzando la versione trunk - che fornisce lo Story of your compile. Questo può o non può essere rilevante per il compilatore 1.6 ma può indicare cosa sta succedendo.
+0

Quella roba di SOYC sembra pulita, grazie per il suggerimento. – skaffman

+0

I punti di ingresso multipli dovrebbero funzionare, ma non i moduli perché GWT controlla sempre tutto ciò che è connesso al tuo codice e compila un risultato finale monolitico. La struttura GWT è un disastro e una vergogna per i principi di modularità. Non ho trovato un buon progetto che riutilizzasse le strutture GWT. – user1050755

58

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 si otterranno differenze nell'ordine delle magnitudini (non tutto nel compilatore è parallelizzabile) ma si tratta comunque di una notevole accelerazione se si compongono più permutazioni.

Se si desidera utilizzare la versione trunk di GWT, sarà possibile utilizzare la modalità host per qualsiasi browser (out of process hosted mode), che allevia la maggior parte degli attuali problemi con la modalità host. Questo sembra essere il punto in cui il GWT sta andando - si sviluppa sempre con la modalità hosted, dal momento che le compilazioni non sono in grado di ottenere grandezze più velocemente.

+2

Ah, l'opzione LocalWorkers è una gemma, che vale la pena conoscere. Purtroppo, la maggior parte delle nostre scatole di sviluppo sono xeoni single-core. Anche 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 riga di comando GWT compilare usando -localWorkers, con locals e user.agents minimi; assicurati che la casella che ospita il vm sia un peer di rete a cui stai distribuendo. La combinazione di ciò porta la compilazione a circa 30 secondi con l'implementazione in tomcat. Inoltre, tutto questo può essere scritto in uno script. Puoi anche sviluppare 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ìì! –

+0

Il client NX è anche un enorme +++ per lo sviluppo remoto su connessioni ADSL, via cavo o WiFi limitate. Inoltre, sei sempre in sincronia indipendentemente dal comp che utilizzi in qualsiasi posizione w/internet –

51

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

Basta includere il flag: -draftCompile alla riga del compilatore GWT.

+3

Ho usato quell'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 questo. – Vic

4

Per GWT 2.x Ho appena scoperto che se si utilizza

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

È anche possibile specificare più di un permutazione.

29

Here is a list of user.agent values è possibile impostarlo su.

(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"/>)

+0

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

+0

Va nel file ABC.gwt.xml del modulo in cui ABC è il nome del tuo modulo. – Glenn

30

Nelle versioni più recenti di GWT (partendo sia 2.3 o 2.4, credo), puoi anche aggiungere

<collapse-all-properties /> 

al tuo gwt.xml per scopi di sviluppo. Questo dirà al compilatore GWT di creare una singola permutazione che copra tutte le localizzazioni e i browser.Pertanto, è ancora possibile provare in tutti i browser e le lingue, ma sono ancora solo la compilazione di una sola permutazione

+2

Interessante ... qual è il rovescio della medaglia? – skaffman

+0

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 questo è ancora un enorme miglioramento rispetto alla compilazione di più permutazioni) – Chi

+0

Non riesco a trovare un collegamento doc per questo ... puoi collegarti a qualcosa? – skaffman

13

È possibile aggiungere un'opzione per la vostra generazione per la produzione di:

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

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

-draftCompile che consente più veloce, ma compilation meno ottimizzati

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

Un'altra cosa che ha più che raddoppiato le prestazioni di build e di modalità hosted era 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 il costo del tuo tempo, potrebbe valerne la pena!

Spero che questo ti aiuti!

+0

L'impostazione dei lavoratori locali sul numero di core può essere molto improduttiva. Vedi questo per riferimento: http://josephmarques.wordpress.com/2010/07/30/gwt-compilation-performance/ –

+0

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