¿Por qué es 2 * (i * i) más rápido que 2 * i * i en Java?
El siguiente programa Java tarda en promedio entre 0.50s y 0.55s para ejecutarse:
public static void main(String[] args) {
long startTime = System.nanoTime();
int n = 0;
for (int i = 0; i < 1000000000; i++) {
n += 2 * (i * i);
}
System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s");
System.out.println("n = " + n);
}
Si reemplazo2 * (i * i)
con2 * i * i
, tarda entre 0,60 y 0,65 segundos en ejecutarse. ¿Cómo
Ejecuté cada versión del programa 15 veces, alternando entre las dos. Aquí están los resultados
2*(i*i) | 2*i*i
----------+----------
0.5183738 | 0.6246434
0.5298337 | 0.6049722
0.5308647 | 0.6603363
0.5133458 | 0.6243328
0.5003011 | 0.6541802
0.5366181 | 0.6312638
0.515149 | 0.6241105
0.5237389 | 0.627815
0.5249942 | 0.6114252
0.5641624 | 0.6781033
0.538412 | 0.6393969
0.5466744 | 0.6608845
0.531159 | 0.6201077
0.5048032 | 0.6511559
0.5232789 | 0.6544526
La carrera más rápida de2 * i * i
tardó más que la ejecución más lenta de2 * (i * i)
. Si ambos fueran tan eficientes, la probabilidad de que esto ocurriera sería menor que 1/2 ^ 15 = 0.00305%.