为什么这个循环(到10亿)只需要执行几个声音......
for (i = 0; i < 1000000000; i++)
{
}
...但是这个循环(达到100亿)需要> 10分钟?
for (i = 0; i < 10000000000; i++)
{
}
它不应该只需要30秒左右(3秒x 10)?
答案 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位有符号整数的所有可能值。