出于好奇,我最近在Java中编写了两个嵌套for循环,它们都只计算到10亿(1'000'000'000)。
令人惊讶的是,Java在不到一秒的时间内完成了这项任务。在其他语言中,这种情况永远不会那么快。
另一个奇怪的事情是,当我添加第三个for循环,嵌套时,程序似乎没有结束。
有人可以告诉我速度来自何处?
修改:
以下是我的代码:
for (int i = 0; i < 1000000000; i++) {
for (int r = 0; r < 1000000000; r++) { }
}
System.out.println("done");
答案 0 :(得分:3)
java编译器优化循环并将其删除。但是,如果使用volatile int:
,则情况并非如此static volatile int i;
public static void main(String[] args) {
for (i = 0; i < 1000000000; i++);
}
以上循环将花费大量时间,因为现在java编译器无法优化循环。
答案 1 :(得分:1)
Assuming Your using Java 8 a great deal of performance optimizations have been made to java over the years。 As this test shows for & while loops are way faster than iterators。只是循环是你可以执行的最快的操作之一。正如@kevin在评论中所提到的,编译器很可能决定跳过循环的迭代来优化代码。这就是为什么穷人的睡眠功能(计数到很多,从来没有真正那么准确)[[第二个答案提到编译器如何优化这一点因此使这些原始自己做睡眠功能不可靠。] 3 < / p>
第三个循环失败的原因是因为你的指数大小增加了。你有效地尝试迭代到10亿然后10亿到第二个权力然后10亿到第三个权力。
您还要将这些结果与哪些语言进行比较,并确定您的代码类似。同样对于你的第三种情况,你可能只需要等待它完成执行,假设你没有得到错误/例外。
答案 2 :(得分:-1)
编译器通过完全删除循环来优化代码,因为它们对程序没有任何影响。
尝试这种方式,看看会发生什么:
int i, r;
for (i = 0; i < 1000000000; i++) {
for (r = 0; r < 1000000000; r++) { }
}
System.out.println(String.format("Done. i=%d r=%d", i, r));
现在我强迫编译器编译循环,因为i
和r
都是从循环内外访问的。