只需增量(从零开始)溢出多长时间需要多长时间?

时间:2010-07-31 00:57:07

标签: java

如果我有这样的代码

    for (long i = 0; i < Long.MAX_VALUE; i++)
    {
        //do something trivial
    }

理论上循环完成需要多长时间?

5 个答案:

答案 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位计算时,我们没有机会......