最近看到2篇有意思的文章,提出了2个问题
1.为什么遍历有序数组比无序数组快?
2.arr[i][j] 与 arr[j][i]的区别?
让我们来看看第一个问题,下面给出2段代码
图1
//sort(vec.begin(),vec.end());
clock_t begin = clock();
for(int i = 0;i<10000;++i){
for(int j = 0;j <vec.size();++j){
if(vec[j] >= 5000){
sum += vec[j];
}
}
}
clock_t end = clock();
图2
sort(vec.begin(),vec.end());区别
clock_t begin = clock();
for(int i = 0;i<10000;++i){
for(int j = 0;j <vec.size();++j){
if(vec[j] >= 5000){
sum += vec[j];
}
}
}
clock_t end = clock();
很明显差别就在于一个是排序数组,一个不是,那么运行时间是多少呢?前者平均为818ms,后者359ms。
这就牵扯到cpu的分支预测原理。
那么讲到这里,我们来看一下下面2段代码,他们效率会相差多少呢,或者图2和图4的效率会差多少。相信如果你理解了分支预测你就应该可以想到。
图3
//sort(vec.begin(),vec.end());区别
clock_t begin = clock();
for(int i = 0;i<10000;++i){
for(int j = 0;j <vec.size();++j){
if(vec[j] >= 5){
sum += vec[j];
}
}
}
clock_t end = clock();
图4
sort(vec.begin(),vec.end());
clock_t begin = clock();
for(int i = 0;i<10000;++i){
for(int j = 0;j <vec.size();++j){
if(vec[j] >= 5){区别
sum += vec[j];
}
}
}
clock_t end = clock();
答案是图3与图4效率几乎是一样的。因为数组里的数字几乎都比5大,
持续更新。。。。。。