Avatar ·

¿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?"