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?"
*Tradução de uma pergunta popular do Stack Overflow. Original: "Why is 2 * (i * i) faster than 2 * i * i in Java?"