为什么需要花费这么长时间才能完成100亿到10亿?

时间:2011-11-12 22:51:23

标签: c loops for-loop

为什么这个循环(到10亿)只需要执行几个声音......

for (i = 0; i < 1000000000; i++)
{

}

...但是这个循环(达到100亿)需要> 10分钟?

for (i = 0; i < 10000000000; i++)
{

}

它不应该只需要30秒左右(3秒x 10)?

4 个答案:

答案 0 :(得分:11)

我猜i是一个32位整数变量,因此总是小于100亿(大于2 ^ 32),而10亿仍然适合32位范围(结束于大约2或40亿,取决于签名)。虽然我不知道编译器如何促进这个100亿常量,但他似乎意识到溢出问题并使其成为一个infite循环。

当您i成为long long int(可能是10000000000一个10000000000L时,会发生什么情况,但这似乎没问题?)

答案 1 :(得分:2)

我猜你不会把你在此基准的代码放在这里。编译器可能会优化代码,使其完全不运行。它也可能是i溢出,然后你的循环永远不会结束。

但是,如果您使用i作为数据结构的索引(特别是如果它是一个数组),那么您将拥有内存分页和数据缓存,这会极大地影响性能。

答案 2 :(得分:2)

区别在于1,000,000,000适合32位整数,而10,000,000,000是64位。如果它是一个32位,我将假设它是,它只是溢出并将导致你的循环变得无限。

你的i是64位变量吗?

答案 3 :(得分:0)

如果这对任何人都有帮助:

当32位有符号数字超出其范围2 ^ 31-1时,该数字被解释为负数(由于2C格式)。即:

对于16位数字:

  0111 1111 1111 1111 (32767)
+ 0000 0000 0000 0001 (1)
---------------------
  1000 0000 0000 0000  (Shoulbe 32769 but instead is -32768)
+ 0000 0000 0000 0001
--------------------
  1000 0000 0000 0001 (-32767)....

所以无限循环是因为你只是经历了32位有符号整数的所有可能值。