-1

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

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几秒钟!当我将 更改为intdouble,情况会变得更糟:

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

大约需要18几秒钟才能完成!

我必须在我的真实循环中增加一个int数组元素和一个double变量for,这大约需要30几秒钟!

这里发生了什么事?!为什么仅仅增加一个增量就需要这么多时间?!我知道浮点数据类型double的结构与定点数据类型的结构不同int,但这是造成如此大不同时间的唯一原因吗?第二个例子也是一个int数组元素呢?!

谢谢

4

1 回答 1

1

你自己已经回答了你的问题。

浮点(双)操作不同于整数操作。即使你只是添加1.0f.

您的第二个示例比第一个示例花费的时间更长,因为您添加了一些指针引用。C 中的数组 - 自下而上 - 与指向第一个元素的指针没有太大区别。访问任何元素,即使是第一个元素,都会导致机器代码加载数组的起始地址,将索引(在本例中为 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;

试一试,让我们知道:)

于 2013-05-31T22:12:30.247 回答