为什么嵌套Java循环完成得非常快

为什么嵌套Java循环完成得非常快,java,optimization,nested-loops,Java,Optimization,Nested Loops,出于好奇,我最近在Java中编写了两个嵌套for循环,它们都是10亿(1'000'000'000) 令人惊讶的是,Java在不到一秒钟的时间内完成了这项任务。在其他语言中,这永远不会这么快完成 另一件奇怪的事情是,当我添加第三个for循环(嵌套)时,程序似乎并没有结束 有人能告诉我速度是从哪里来的吗 编辑: 以下是我的代码: for (int i = 0; i < 1000000000; i++) { for (int r = 0; r < 1000000000; r++)

出于好奇,我最近在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");
for(inti=0;i<100000000;i++){
对于(int r=0;r<100000000;r++){
} 
系统输出打印项次(“完成”);
。仅仅通过一个循环是你能执行的最快的操作之一。正如@kevin在评论中提到的,编译器很可能决定跳过循环的迭代来优化代码。这就是为什么穷人的睡眠函数(计算到一个很大的数字,从来没有那么准确(第二个答案提到编译器如何优化它,从而使这些原始的自己动手睡眠函数不可靠。)

第三个循环失败的原因是因为你的循环的大小呈指数级增长,你有效地尝试了迭代到10亿次方,然后10亿次方到第二次方,然后10亿次方到第三次方


另外,您将这些结果与哪些语言进行比较,并且您是否确定您的代码是相似的。对于第三种情况,您可能只需要等待它完成执行,假设您没有收到错误/异常。

java编译器优化循环并删除它。但如果您使用易失性int,则情况并非如此:

static volatile int i;

public static void main(String[] args) {
    for (i = 0; i < 1000000000; i++);
}
static volatile inti;
公共静态void main(字符串[]args){
对于(i=0;i<100000000;i++);
}

上面的循环将花费大量时间,因为现在java编译器无法优化循环。

编译器通过完全删除循环来优化代码,因为它们对程序没有任何影响

试着这样做,看看会发生什么:

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));
inti,r;
对于(i=0;i<100000000;i++){
对于(r=0;r<100000000;r++){}
}
System.out.println(String.format(“Done.i=%d r=%d”,i,r));

现在我强制编译器编译循环,因为
I
r
都是从循环内部和外部访问的。

如果循环或迭代没有任何效果,编译器也可以决定优化和/或跳过循环或迭代。如果使用java 4或java 5运行代码并查看它们是否有效,这可能很有趣优化仍然存在。我知道提高性能对于java 6和7来说是一个非常重要的主题。也谢谢你的回答。我还以为第二个循环被省略了,但后来我打印了第二个循环的变量,它是10亿。所以它显然省略了循环,但仍然将变量设置为10亿。我尝试了同样的方法在C和汇编语言中,但它们的结果并没有在Java中得到的那么快,您使用的是哪种编译器?这也是我的预期。代码如下所示。for(int i=0;i<100000000;i++){for(int r=0;r<100000000;r++){}System.out.println(“完成”)@johnw这绝对是一个编译器优化。我相应地编辑了我的答案。