2013-02-07 8 views
13

Ho letto il numero "What's new in Groovy 2.0" e sono un po 'confuso su quando usare @CompileStatic. L'articolo menziona che l'annotazione @CompileStatic è stata aggiunta per gli sviluppatori che non erano in grado di sfruttare la parte dinamica di Java7.Devo usare Groovy's @CompileStatic se sto usando Java 7

Così gli sviluppatori alla ricerca di miglioramenti delle prestazioni non avrebbe visto cambia molto in Groovy 2.0, se non sono in grado di girare su JDK 7. Per fortuna, il team di sviluppo Groovy pensato gli sviluppatori potrebbero ottenere interessante incremento delle prestazioni, tra le altre vantaggi, consentendo di compilare staticamente il codice di tipo controllato.

La mia domanda è, se sto usando JDK 7 e seguire le istruzioni per aggiungere il flag --indy, devo aggiungere @CompileStatic per vedere alcuni aumenti di prestazioni? This blog suggerisce che lo farei, ma non sono sicuro che abbia compilato correttamente dato che l'ha fatto all'interno di Eclipse.

Aggiornamento: Qui ci sono le statistiche quando si eseguono diverse permutazioni del codice di Fibonacci.

> groovy --indy FibBoth.groovy 
..........Fib (non-static indy): 1994.465 
..........Fib (static indy): 529.197 

> groovy FibBoth.groovy  
..........Fib (non-static): 1212.788 
..........Fib (static): 525.671 

Nota: questa domanda sembra un po 'confusa ora che capisco che le funzionalità sono indipendenti. Poiché la base della domanda è attorno alla confusione dalle note che mi hanno fatto pensare che le due caratteristiche erano correlate, penso che abbia senso non cambiare la formulazione della domanda e consentire la risposta accettata che spiega le differenze.

risposta

12

La versione indy è completamente dinamica Groovy, come è noto, solo più veloce grazie a JDK 7 invokedynamic. @CompileStatic significa compilazione statica. Sebbene più veloce del normale Groovy, può compilare solo un sottoinsieme di Groovy e si comporta in modo leggermente diverso. Soprattutto tutte le funzionalità dinamiche non sono più disponibili. Quindi, se si desidera utilizzare le funzionalità dinamiche, indy è l'unica opzione. Se sarai un ragazzo statico e userai solo una piccola parte della lingua, puoi usare @CompileStatic.

Fibonacci non è un test in cui invokedynamic può brillare. La porta indy non è sempre migliore. Ma se fai molto per esempio con la meta-programmazione, allora indy sarà migliore.

si deve decidere in base all'utilizzo, alla fine

+0

Buona risposta. La parte che mi mancava dal testo della release è che sono caratteristiche indipendenti. Quindi, anche se si utilizza Java 7 con -indy, CompileStatic può dare un potenziamento perf (purché il codice possa effettivamente essere controllato dal compilatore). Abbiamo fatto un rapido test delle diverse permutazioni con indy e CompileStatic con Fibonacci e abbiamo trovato quanto segue: – Scott

5

Per far bollire il basso, @CompileStatic rimuove alcune funzionalità di runtime dinamico Groovy a favore della velocità.

Quindi, in teoria:

  • JDK7 dovrebbe essere più veloce di JDK6 a causa della invokedynamic
  • @CompileStatic dovrebbe essere più veloce di standard perché un certo overhead e le caratteristiche vengono rimossi.

Tutto ciò con l'avvertenza che dipenderà in gran parte da ciò che si sta facendo, in quanto le varie funzionalità sono ottimizzate in gradi diversi.

Problemi correlati