这是我的程序代码的一部分:
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
数组元素呢?!
由于
答案 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;
尝试一下,让我们知道:)