在Java中为什么2 * (i * i)比2 * i * i计算的更快?

bitbit
最后编辑于 12月01日 开发

这是StackOverflow上一个叫做Stefan的哥们提出的一个问题,挺有意思。回答者从字节码及JIT和汇编代码的层面给出了合理的解释。

在Java中是这样,不知道用其它编程语言实现这段代码是什么结果,程序员可以试一试:

public static void main(String[] args) {
    long startTime = System.nanoTime();
    int n = 0;
    for (int i = 0; i < 1000000000; i++) {
        n += 2 * (i * i);
    }
    System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s");
    System.out.println("n = " + n);
}

2 * (i * i) 平均用时 0.50s - 0.55s
2 * i * i 平均用时 0.60s - 0.65s

这是StackOverflow上的问题原文:
Why is 2 * (i * i) faster than 2 * i * i in Java?

如果就题论题的话,我更喜欢空间换时间,把2 * i * i写成这样的:
int m = 0;
int n = 0;
n = i * i;
m = n + n;

登录注册后才能评论。