我写了以下Java测试
public class NegativeTest {
/**
* @param args
*/
public static void main(String[] args) {
long start = System.currentTimeMillis();
int value = 12345;
for (int j = 0; j < 30; j++) {
for (int i = 0; i < 1000000000; i++) {
value = value * -1 - i;
}
}
System.out.println(System.currentTimeMillis() - start);
//to avoid compilation optimization
System.out.println(value);
}
}
在我的 Intel(R) Core(TM) i5-3210M (Ivy-Bridge) 机器上完成大约需要1.3 秒,但是在我更改线路之后
价值 = 价值 * -1 - 我
至
价值 = 价值 - 我,
然后大约需要10 秒才能完成(大约是以前版本的 10 倍)!
当我在其他非 Sandy Bridge CPU 上运行此测试时,结果完全相反:value = value * -1 - i版本花费的时间是value = value - i版本 的两倍!
谁能解释这个区别?是否与 Sandy Bridge 架构中的任何特定优化设计有关?