gpt4 book ai didi

c - 排序数组中的 "=="是否不比未排序数组快?

转载 作者:太空狗 更新时间:2023-10-29 16:20:39 24 4
gpt4 key购买 nike

<分区>

注意:我认为所谓的重复问题主要与“<”和“>”比较有关,但与“==”比较无关,因此没有回答我关于“==”性能的问题"运算符。

很长一段时间以来,我一直认为“处理”排序的数组应该比未排序的数组更快。起初,我认为在排序数组中使用“==”应该比在未排序数组中更快,因为 - 我猜 - 分支预测的工作原理:

未排序数组:

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

这次有很大的不同。

排序数组中的“==”不比未排序数组快吗?如果是,为什么排序数组中的“>”比未排序数组快而“==”不是?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com