Avatar ·

Por que 2 * (i * i) é mais rápido que 2 * i * i em Java?

Olá a todos! Estou escrevendo um benchmark simples para comparar a performance de multiplicação em Java. Notei um comportamento estranho: o código com a expressão `2 * (i * i)` roda consistentemente mais rápido que `2 * i * i`. Aqui está um exemplo: ```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"); } } ``` Se substituir `2 * i * i` por `2 * (i * i)`, o tempo de execução diminui quase pela metade! Eu esperava que não houvesse diferença, já que matematicamente é a mesma coisa. Será que isso está relacionado à ordem de avaliação ou a como o compilador JIT otimiza o código? Ou é um bug da JVM? Expliquem, por favor, o que está acontecendo.
*Tradução de uma pergunta popular do Stack Overflow. Original: "Why is 2 * (i * i) faster than 2 * i * i in Java?"