Примечание: предполагаемый дублирующий вопрос, я думаю, в основном связан с "<" и " > " сравнение, но не сравнение "==" и, следовательно, не отвечает на мой вопрос об эффективности оператора "==" .
Долгое время я считал, что "обработка" отсортированного массива должна быть быстрее, чем несортированный массив. Сначала я подумал, что использование "==" в отсортированном массиве должно быть быстрее, чем в несортированном массиве, потому что, я думаю, о том, как работает предсказание ветвей:
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();
чтобы проверить, просто подсчитайте, равно ли value == 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);
}
выполните три раза:
UNSORTEDARRAY
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
на этот раз есть большая разница.
Является ли "==" в отсортированном массиве не быстрее, чем несортированный массив? Если да, то почему " > " в отсортированном массиве выполняется быстрее, чем несортированный массив, но "==" не является?