注意:所谓的重复问题与“<”和“>”比较有关,但不是“==”比较,因此不能回答我关于“==”运算符性能的问题。
很长一段时间以来,我一直认为“处理”排序数组应该比未排序数组快。起初,我认为在排序数组中使用“ == ”应该比在未排序数组中使用更快,因为-我猜测-分支预测的工作方式:
UNSORTEDARRAY:
5 == 100 F
43 == 100 F
100 == 100 T
250 == 100 F
6 == 100 F
(other elements to check)
SORTEDARRAY:
5 == 100 F
6 == 100 F
43 == 100 F
100 == 100 T
(no need to check other elements, so all are F)
我猜排序数组(SORTEDARRAY)应该比未排序数组(UNSORTEDARRAY)更快,但今天我使用代码在头文件中生成了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
SORTEDARRAY
0.005334
0.005120
0.005223
看起来只是一点点性能差异,所以我不相信它,然后尝试将“SORTEDARRAY [i] == RAND_MAX / 2”更改为“SORTEDARRAY [i]> RAND_MAX / 2”,以查看是否有所不同:
UNSORTEDARRAY
0.008407
0.008363
0.008606
SORTEDARRAY
0.005306
0.005227
0.005146
这一次有很大的不同。
在排序数组中,"==" 是否比未排序数组更快?如果是,为什么在排序数组中 ">" 操作比未排序数组更快但 "==" 却不是?
string
不是 C 语言的标准类型,使用+=
运算符将一个操作数设为string
类型,另一个操作数设为char *
类型是没有意义的。您确定这不是 C++ 代码吗? - autistic