¿Por qué 2 * (i * i) es más rápido que 2 * i * i en Java?
¡Hola a todos! Estoy escribiendo un simple benchmark para comparar el rendimiento de la multiplicación en Java. Noté un comportamiento extraño: el código con la expresión `2 * (i * i)` se ejecuta consistentemente más rápido que `2 * i * i`. Aquí hay un ejemplo:
```java
public class Test {
public static void main(String[] args) {
long start = System.nanoTime();
long sum = 0;
for (int i = 0; i < 1_000_000_000; i++) {
sum += 2 * i * i; // lento
}
System.out.println(sum);
System.out.println("Time: " + (System.nanoTime() - start) / 1_000_000 + " ms");
}
}
```
Si reemplazas `2 * i * i` con `2 * (i * i)`, el tiempo de ejecución se reduce casi a la mitad! Esperaba que no hubiera diferencia, ya que matemáticamente es lo mismo. ¿Quizás está relacionado con el orden de las operaciones o con cómo el compilador JIT optimiza el código? ¿O es un bug de la JVM? Por favor, expliquen qué está pasando.
*Traducción de una pregunta popular de Stack Overflow. Original: "Why is 2 * (i * i) faster than 2 * i * i in Java?"
*Traducción de una pregunta popular de Stack Overflow. Original: "Why is 2 * (i * i) faster than 2 * i * i in Java?"