特别是,循环次数越多,差异就越明显。
用g ++测试而不进行优化
int main()
{
int a[]={0,0};
int b[]={0,0};
//first loop
for(unsigned int i=0;i<0x00FFFFFF;i++)
{
a[0]++;a[1]++;
}
//second loop
for(unsigned int i=0;i<0x00FFFFFF;i++)
{
b[0]++;b[0]++; //yes it's b[0] not b[1]
}
return 0;
}
有人可能不相信我,我也是。但在这段代码中,第一个循环至少比第二个循环快两倍。
我怀疑这是一个流水线问题。在第一个循环中,您正在写入两个不同的内存位置,因此第二个添加不需要等待第一个完成,并且CPU可以同时执行这两个操作。
在第二个循环中,您将两次递增相同的变量,因此第二个循环必须等待第一个变量完成。这会减慢管道速度。