为什么 2 * (i * i) 在 Java 中比 2 * i * i 执行得更快?
大家好!我正在编写一个简单的 benchmark 来比较 Java 中乘法的性能。我注意到一个奇怪的行为:使用 `2 * (i * i)` 表达式的代码运行速度稳定地比 `2 * i * i` 快。以下是一个示例:
```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; // 慢
}
System.out.println(sum);
System.out.println("Time: " + (System.nanoTime() - start) / 1_000_000 + " ms");
}
}
```
如果将 `2 * i * i` 替换为 `2 * (i * i)`,执行时间几乎减少了一半!我原本以为不会有差异,因为数学上它们是等价的。这可能与计算顺序或 JIT 编译器优化代码的方式有关吗?或者是 JVM 的 bug?请解释一下发生了什么。
*翻译自 Stack Overflow 的热门问题。原文:"Why is 2 * (i * i) faster than 2 * i * i in Java?"
*翻译自 Stack Overflow 的热门问题。原文:"Why is 2 * (i * i) faster than 2 * i * i in Java?"