2012-01-11 38 views
6

Durante la corrección de errores en muy viejo proyecto que me he enfrentado con el método extraño, que se parece a esto:un bucle con un cuerpo vacío en Java

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

¿Causa detener algún tiempo o que se omitirán por ¿Optimización de JVM?

+1

¿Por qué yo uever escribir una pieza de código ... tal? –

+0

No es mío, acabo de comenzar a trabajar con este proyecto ...: D –

+0

Creo que para pausar la ejecución del programa, él está usando esta lógica. ;) –

Respuesta

5

Se optimizó después de unas vueltas por JIT. La JVM, en la primera ejecución, debe verificar si el valor i que se está incrementando no se está utilizando en ninguna parte.

Comprobar este artículo así:

Java: how much time does an empty loop use?

2

Puede estar optimizado, puede que no. Depende del nivel de optimización en el compilador.

La variable i tiene un alcance al ciclo, por lo que no estará disponible después. El compilador puede identificar estáticamente que el ciclo se ejecutará una cantidad conocida de veces. También sabe que la declaración vacía se repite muchas veces. A continuación, puede transformar un número de instrucciones vacías en una declaración vacía, o ninguna declaración en absoluto. Esto tiene el efecto de eliminar el código por completo del árbol de sintaxis abstracta.

Esto sucederá en algunos ajustes de optimización y compiladores, y no en otros.

+0

¿Podría respaldarlo con un poco de documentación? Por "optimizado", ¿te refieres a "eliminado"? Parecería extraño que el compilador omita algún fragmento de código. –

+0

@ ŁukaszBachman El caso óptimo es omitir ese código y establecer i 20000. – holgac

+0

¡Ni siquiera eso, porque 'i' tiene el alcance del ciclo! – Joe

1

No sé si ha cambiado, no he usado java durante 2 años, pero parece que no.

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

Esta prueba también confirma que el código de bytes compilador "javac" Java es no haciendo ninguna optimización para reemplazar el bucle vacío con "i = pasos" que es el efecto neto del bucle.

+0

javac no ha hecho, no funciona y nunca hará ningún tipo de optimizaciones interesantes. Y el enlace muestra una de las pruebas de marcar su puntaje. Independientemente de cuán grande establezca el valor del contador, obtendrá el mismo resultado: ejecuta el bucle ~ 10k veces en el intérprete, el JIT entra en acción y elimina el resto del bucle independientemente de su tamaño. Aunque en ese caso parece ser el resultado esperado. – Voo

0

Sí, será optimised.I've intentó: D

+0

¿Con qué compilador/configuración? –

Cuestiones relacionadas