如果我有这样的代码
for (long i = 0; i < Long.MAX_VALUE; i++)
{
//do something trivial
}
理论上循环完成需要多长时间?
答案 0 :(得分:19)
假设,只是为了论证,你有一台非常快的计算机,每秒可以执行大约20亿次循环迭代(2 GHz机器可能只是勉强这样做,如果真的没有循环中的任何东西)。由于Long.MAX_VALUE
是40亿次40亿,所以这个循环大约需要40亿秒,或者超过120年。
今天开始这个循环毫无意义。等到计算机变得更快,然后它会更快完成。
答案 1 :(得分:6)
我相信你所寻找的答案是:它不会在你的一生中完成。
编辑:我应该有资格 - 在我能想到的现有硬件或任何硬件上;也许当量子计算变得流行时,你将不得不重新评估这个问题。
答案 2 :(得分:2)
这可能需要一生的时间才能运行。
但根据问题的标题,我猜你试图运行一个非常多次的循环,并且你计划在某种情况发生时打破循环。即你有一些
if (ancondition == true)
{
break;
}
你只需要确保你没有因为溢出而得到任何异常。 (例如:你将要监视地震传感器多年。)因此,在那个范围内你可以安全地去。
但另一方面,这不是一个好的编程方法。绝对可以通过其他方式改进代码。(可能是定期检查)
答案 3 :(得分:1)
一个可能的答案是零秒。编译器可以非常积极并优化整个循环,因为它显然没有做任何有趣的事情......
这是一个很好的相关故事:编译器优化了循环,搜索费马的最后定理的反例。因为定理是正确的(所以我们被告知)并且没有反例,循环应该永远不会终止。但编译器决定它应该终止。
http://blog.regehr.org/archives/161
(文章提到不允许java编译器终止fermat循环)
答案 4 :(得分:0)
将此放入wolframalpha.com
(2 ^ 63 -1)/(2 * 10 ^ 9)秒
2 ^ 63-1是MAX_VALUE的当前值,2 * 10 ^ 9是2 GHZ处理器,每个时钟周期一次递增循环。
现在提出
(2 ^ 63 -1)/(4 * 10 ^ 9)秒
表示机器速度加倍到4 GHZ。
最快的超级计算机可以达到1.75千万亿次(10 ^ 15)。这是一个并行化的应用程序,所以它不是一个大循环,但如果你问“需要多长时间才能做2 ^ 63-1个触发器”,在那台机器上它的
http://www.wolframalpha.com/input/?i=(2 ^ 63 + 1)/(1.75 * 10 ^ 15)+秒
我们让晶体管运行的最快速度是500 GHZ。来自http://en.wikipedia.org/wiki/Moore's_law
“晶体管在4.5 K(-451°F / -268.65°C)下运行在500 GHz以上[41]并且模拟显示它可能在1 THz(1,000 GHz)下运行。但是,该试验仅测试了单晶体管。“
所以,如果你把它插入wolfram alpha,你会得到7个月。因此,单个晶体管不是环路处理单元,但您明白了。可以想象的硬件在我们的技术掌握范围内,甚至可以通过2 ^ 63-1循环迭代进行流失。如果你认为OP是“多长时间做2 ^ 63位翻转”,那么这台机器符合这个标准,并且很容易在一生中完成。
但是当我们转向128位计算时,我们没有机会......