【发布时间】:2018-06-06 01:00:27
【问题描述】:
我在配备 2.7 GHz Intel Core i7 的笔记本电脑上运行以下 Java 代码。我打算让它测量完成 2^32 次迭代的循环需要多长时间,我预计大约需要 1.48 秒(4/2.7 = 1.48)。
但实际上只需要 2 毫秒,而不是 1.48 秒。我想知道这是否是任何 JVM 优化的结果?
public static void main(String[] args)
{
long start = System.nanoTime();
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++){
}
long finish = System.nanoTime();
long d = (finish - start) / 1000000;
System.out.println("Used " + d);
}
【问题讨论】:
-
嗯,是的。因为循环体没有副作用,编译器很乐意消除它。使用
javap -v检查字节码以查看。 -
您不会在字节码中看到它。
javac很少进行实际优化,大部分都留给了 JIT 编译器。 -
'我想知道这是否是任何 JVM 优化的结果?' - 你怎么看?如果不是 JVM 优化,还能是什么?
-
这个问题的答案基本都包含在stackoverflow.com/a/25323548/3182664中。它还包含 JIT 为此类情况生成的结果程序集(机器代码),表明 JIT 完全优化了循环。 (stackoverflow.com/q/25326377/3182664 的问题表明,如果循环不执行 40 亿次操作,而是执行 40 亿次减一 ;-),则可能需要更长的时间)。我几乎会将这个问题视为与其他问题的重复——有什么反对意见吗?
-
您假设处理器将每赫兹执行一次迭代。这是一个影响深远的假设。正如@Rahul 所提到的,今天的处理器执行各种优化,除非您对 Core i7 的工作原理有更多了解,否则您不能假设。