2012-01-11 19 views
6

Durante bug fixing molto vecchio progetto che ho affrontato con metodo strano, sembra che questo:un ciclo con un corpo vuoto in Java

void waiter() { 
     for (int i = 0; i < 20000; i++) ; 
    } 

vuol causa arrestare un certo momento o che verrà omessa Ottimizzazione JVM?

+1

Perché sarebbe yo uever scrivere un pezzo di ... codice? –

+0

Non è mio, ho appena iniziato a lavorare con questo progetto ...: D –

+0

penso che per mettere in pausa l'esecuzione del programma, sta usando questa logica. ;) –

risposta

5

Sarà ottimizzato dopo qualche giro di JIT. La JVM, alla prima esecuzione, deve verificare se il valore se i che viene incrementato non viene utilizzato da nessuna parte.

Controllare questo articolo così:

Java: how much time does an empty loop use?

2

Potrebbe essere ottimizzato, potrebbe non farlo. Dipende dal livello di ottimizzazione nel compilatore.

La variabile i ha ambito il ciclo, quindi non sarà disponibile dopo. Il compilatore è in grado di identificare staticamente che il ciclo eseguirà un numero noto di volte. Sa anche che l'affermazione vuota viene ripetuta molte volte. Può quindi trasformare un numero di istruzioni vuote in un'istruzione vuota o nessuna istruzione. Questo ha l'effetto di rimuovere del tutto il codice dall'albero di sintassi astratto.

Questo avverrà in alcune impostazioni di ottimizzazione e compilatori e non in altri.

+0

Potresti eseguire il backup con qualche documentazione? Per "ottimizzato" intendi "cancellato"? Sembrerebbe strano che il compilatore ometta qualche pezzo di codice. –

+0

@ ŁukaszBachman Il caso ottimale è omettere quel codice e impostare l'i 20000. – holgac

+0

Neanche quello, perché "i" è circoscritto al ciclo! – Joe

1

Non so se è cambiato, non ho usato Java per 2 anni ma non sembra.

http://www.herongyang.com/JVM/Benchmark-Int-Empty-Loop-16-Nanosecond.html http://www.herongyang.com/JVM/Benchmark-Long-Empty-Loop-25-Nanosecond.html

Questo test conferma inoltre che il bytecode Java compilatore "javac" è non fare alcuna ottimizzazione per sostituire il ciclo vuoto con "i = passi" che è l'effetto netto del ciclo.

+0

javac non ha fatto, non fa e non farà mai alcun tipo di ottimizzazioni interessanti. E il link mostra uno dei test dial-your-score. Indipendentemente dall'ampiezza del valore del contatore, otterrai lo stesso risultato: esegui il ciclo ~ 10k volte nell'interprete, JIT esegue il kick-in e rimuove il resto del ciclo indipendentemente da quanto grande. Anche se in questo caso sembra essere il risultato voluto. – Voo

0

Sì, sarà optimised.I've cercato: D

+0

Con quale compilatore/impostazione? –

Problemi correlati