que tienen los dos programas siguientes:velocidad de iteración de int vs largo
long startTime = System.currentTimeMillis();
for (int i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
y
long startTime = System.currentTimeMillis();
for (long i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
Nota: la única diferencia es el tipo de la variable de bucle (int
y long
).
Cuando ejecuto esto, el primer programa imprime constantemente entre 0 y 16 mseg, independientemente del valor de N
. El segundo toma mucho más tiempo. Para N == Integer.MAX_VALUE
, se ejecuta en aproximadamente 1800 mseg en mi máquina. El tiempo de ejecución parece ser más o menos lineal en N
.
¿Por qué es esto?
Supongo que el compilador JIT optimiza el ciclo int
hasta la muerte. Y por una buena razón, porque obviamente no hace nada. ¿Pero por qué no lo hace para el lazo long
también?
Un colega pensó que podríamos estar midiendo el compilador JIT haciendo su trabajo en el ciclo long
, pero dado que el tiempo de ejecución parece lineal en N
, probablemente este no sea el caso.
estoy usando JDK 1.6.0 actualización 17:
C:\>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
estoy en Windows XP Professional x64 Edition, Service Pack 2, con una CPU Intel Core2 Quad a 2,40 GHz.
RENUNCIA
sé que microbenchmarks no son útiles en la producción. También sé que System.currentTimeMillis()
no es tan preciso como sugiere su nombre. Esto es solo algo que noté mientras bromeaba, y simplemente tenía curiosidad sobre por qué sucede esto; nada mas.
absolutamente Estoy de acuerdo con @Andrzej aquí, pero si en realidad es sólo por curiosidad, podría usar el complemento PrintAssembly para ver realmente el código generado: http://wikis.sun.com/display/HotSpotInternals/PrintAssembly –
¿Qué sucede si se ejecuta con el indicador -Xint? Esto evita la compilación de zonas activas, por lo que obtendrá una mejor comparación. –
@Steven: pero con '-Xint' el resultado es * aún menos * significativo para cualquier cosa que se parezca al uso real. –