Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么跳过for循环?_Java_Jvm - Fatal编程技术网

Java 为什么跳过for循环?

Java 为什么跳过for循环?,java,jvm,Java,Jvm,但是当我对最后一个S.O.p语句进行注释时,它打印了“m”的值,那么运行时间大约是7 Going into the loop Out of the loop Time : 13321 m : 10000997 那么为什么会发生这种情况呢?是否跳过for循环 编译器优化了代码,并意识到变量m实际上是一个可以删除的死存储。然后它意识到if根本不做任何事情(在m被删除之后),并且也删除了它。内环和外环也是如此。在循环中添加print语句,您将自己看到它们是否正确skipped@Stultuske这将

但是当我对最后一个S.O.p语句进行注释时,它打印了“m”的值,那么运行时间大约是7

Going into the loop
Out of the loop
Time : 13321
m : 10000997

那么为什么会发生这种情况呢?是否跳过for循环

编译器优化了代码,并意识到变量m实际上是一个可以删除的死存储。然后它意识到if根本不做任何事情(在m被删除之后),并且也删除了它。内环和外环也是如此。

在循环中添加print语句,您将自己看到它们是否正确skipped@Stultuske这将改变人们的行为。。。因为循环不能被优化掉(因为要打印),我不确定,但也许编译器会优化代码并删除循环,因为在注释最后一条打印语句时循环变得多余。@Nicktar它会改变所花费的时间,但如果我们说的是函数式的,不,它不会。但是,它将非常清楚地显示是否跳过循环。@Stultuske在删除对m变量的冗余赋值后,它将停止JIT编译器将整个循环标记为冗余。因此,它将强制执行(最有可能是展开的)循环,否则这些循环将被完全删除。注意:这是JIT编译器完成的,而不是javac。进一步注意,它不必以这种方式工作。一般来说,它可以从结果值和可感知的副作用遍历一个图,然后执行获取必要值所需的操作,有效地跳过所有不需要的操作,甚至不看它。这取决于内部IR的设计。@Holger您当然是对的。即使使用内部日志的输出,分析JRE的优化也是很困难的,没有这些日志,这充其量只是一个有教育意义的猜测,我故意跳过了很多步骤(循环展开、常量值传播等),但是对于这么小的一个例子,我认为猜测是合理的。
Going into the loop
Out of the loop
Time : 13321
m : 10000997
Going into the loop
Out of the loop
Time : 7