循环速度有些奇怪

时间:2013-05-31 21:58:38

标签: objective-c

这是我的程序代码的一部分:

int test;
for(uint i = 0; i < 1700; i++) {
    test++;
}

整个程序需要0.5秒才能完成,但当我将其更改为:

int test[1];
for(uint i = 0; i < 1700; i++) {
    test[0]++;
}

它需要3.5秒!当我将int更改为double时,情况会变得更糟:

double test;
for(uint i = 0; i < 1700; i++) {
    test++;
}

完成后大约需要18秒!

我必须在真正的int循环中增加double数组元素和for变量,并且大约需要30秒!

这里发生了什么?!为什么只需要一个增量就需要那么多时间?! 我知道像double这样的浮点数据类型与int这样的固定点数据类型有不同的结构,但它是导致这么大的不同时间的唯一原因吗?那么第二个例子也是int数组元素呢?!

由于

1 个答案:

答案 0 :(得分:1)

您自己已回答了自己的问题。

float(double)操作与整数操作不同。即使您只是添加1.0f

你的第二个例子比第一个例子花费的时间更长,因为你添加了一些指针引用。 C中的数组是-bottom down-与指向第一个元素的指针没有多大区别。访问任何元素,即使是第一个元素,也会导致机器代码加载数组的起始地址,将索引(在本例中为0)乘以每个成员的长度(4或int具有的任何字节)并添加(0) )到指针。然后它必须取消引用指针,意味着在该地址处实际加载该值。添加一个并回写结果。

智能现代编译器应该对此进行优化。如果要避免此优化,请稍微修改代码,不要为索引使用常量。

我从未尝试过使用现代的objective-c编译器。但我想这段代码需要花费超过3.5秒才能运行:

int test[2];
int index = 0;
for(uint i = 0; i < 1700; i++) {
    test[index]++;
}

如果这没有太大的改变,那么试试这个:

-(void)foo:(int)index {
  int test[2];
  for(uint i = 0; i < 1700; i++) {
      test[index]++;
  }
}

然后拨打foo:0;

尝试一下,让我们知道:)