我正在使用2.7GHz Intel Core i7的笔记本电脑上运行以下Java代码。我打算让它测量用2^32次迭代完成一个循环所需的时间,我预计大约为1.48秒(4/2.7=1.48)
但实际上只需要2毫秒,而不是1.48毫秒;s我想知道这是否是底层JVM优化的结果
公共静态void main(字符串[]args)
{
长启动=System.nanoTime();
对于(int i=Integer.MIN_值;i<;Integer.MAX_值;i++){
}
long finish=System.nanoTime();
长d=(完成-开始)/1000000;
系统输出打印项次(“已使用”+d);
}
这里有两种可能性之一:
-
编译器意识到循环是冗余的,并且什么也不做,所以它优化了它
-
JIT(即时编译器)意识到循环是冗余的,什么也不做,所以它优化了它
现代编译器非常智能;他们可以看到什么时候代码是无用的。尝试将一个空循环放入GodBolt并查看输出,然后打开-O2优化,您将看到输出与
main():
异或eax,eax
ret
我想澄清一点,在Java中,大多数优化都是由JIT完成的。在其他一些语言(如C/C++)中,大多数优化都是由第一个编译器完成的