【发布时间】:2015-11-10 20:21:46
【问题描述】:
注意:我认为,所谓的重复问题主要与“”比较有关,但与“==”比较无关,因此没有回答我关于“==”性能的问题" 运算符。
长期以来,我一直认为“处理”已排序的数组应该比未排序的数组更快。起初,我认为在排序数组中使用“==”应该比在未排序数组中更快,因为 - 我猜 - 分支预测的工作原理:
未排序数组:
5 == 100 F
43 == 100 F
100 == 100 T
250 == 100 F
6 == 100 F
(other elements to check)
排序数组:
5 == 100 F
6 == 100 F
43 == 100 F
100 == 100 T
(no need to check other elements, so all are F)
所以我猜SORTEDARRAY应该比UNSORTEDARRAY快,但是今天我用代码在一个header中生成了2个数组来测试,分支预测似乎并没有像我想象的那样工作。
我生成了一个未排序的数组和一个排序的数组来测试:
srand(time(NULL));
int UNSORTEDARRAY[524288];
int SORTEDARRAY[sizeof(UNSORTEDARRAY)/sizeof(int)];
for(int i=0;i<sizeof(SORTEDARRAY)/sizeof(int);i++){
SORTEDARRAY[i]=UNSORTEDARRAY[i]=rand();
}
sort(SORTEDARRAY,SORTEDARRAY+sizeof(SORTEDARRAY)/sizeof(int));
string u="const int UNSORTEDARRAY[]={";
string s="const int SORTEDARRAY[]={";
for(int i=0;i<sizeof(UNSORTEDARRAY)/sizeof(int);i++){
u+=to_string(UNSORTEDARRAY[i])+",";
s+=to_string(SORTEDARRAY[i])+",";
}
u.erase(u.end()-1);
s.erase(s.end()-1);
u+="};\n";
s+="};\n";
ofstream out("number.h");
string code=u+s;
out << code;
out.close();
所以要测试,只要像这样计算值是否 == RAND_MAX/2:
#include "number.h"
int main(){
int count;
clock_t start = clock();
for(int i=0;i<sizeof(SORTEDARRAY)/sizeof(int);i++){
if(SORTEDARRAY[i]==RAND_MAX/2){
count++;
}
}
printf("%f\n",(float)(clock()-start)/CLOCKS_PER_SEC);
}
运行 3 次:
未排序数组
0.005376
0.005239
0.005220
排序数组
0.005334
0.005120
0.005223
这似乎是一个小的性能差异,所以我不相信它然后尝试将“SORTEDARRAY[i]==RAND_MAX/2”更改为“SORTEDARRAY[i]>RAND_MAX/2”,看看它是否做出了区别:
未排序数组
0.008407
0.008363
0.008606
排序数组
0.005306
0.005227
0.005146
这次有很大的不同。
排序数组中的“==”不比未排序数组快吗?如果是,为什么排序数组中的“>”比未排序数组快,而“==”不是?
【问题讨论】:
-
与有史以来最受欢迎的问题之一有关:stackoverflow.com/questions/11227809/…
-
“我相信“处理”一个排序数组应该比未排序数组更快”:试着回答自己为什么你认为这个算法是正确的。那就是-您为每种情况做什么样的工作以及做多少工作。您可能会意识到答案是什么。
-
string不是 C 中的标准类型,并且将+=运算符与一个string类型的操作数和另一个char *类型一起使用是没有意义的。你确定这不是 C++ 代码吗? -
另外,你用什么来计时这段代码?一些非常不准确的东西,并且可能有偏见。这种问题通常是被误导的人写的你甚至启用了完全优化吗?你有一个实际的问题要解决,以及解决这个问题的程序吗?您是否在该程序上使用分析器来确定重大瓶颈是什么?我问的原因是,在任何实际情况下,瓶颈都会与您所描述的有很大不同。这个问题没有实际用处。
-
你为什么假设“(不需要检查其他元素,所以都是F)”?编译器无法知道这一点,它只会盲目地检查每个内存位置。事实上,使用随机数据,它很少会等于一个固定值,因此很容易被 CPU 预测。
标签: c arrays performance optimization sortedlist