一直很好奇使用指针和下标遍历数组的效率有没有区别,于是测试了一下,总共测试三种遍历情况:
1)给数组每一个元素赋相同的初始值
2)给数组每一个元素赋随机数
3)给数组每一个元素赋当前下标值
三种情况都在g++ 7.0下进行测试,默认使用的C++14标准,分别在默认优化条件(即不加-O情况)和O3优化下进行测试,具体代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 1000000
int main(){
srand(clock());
int *x=(int*)malloc(N*sizeof(int)),*p,*end=x+N;
clock_t t_start;
t_start=clock();
for(int j=0;j<1000;j++){
for(int i=0;i<N;i++) x[i]=rand();
//for(int i=0;i<N;i++) x[i]=0;
//for(int i=0;i<N;i++) x[i]=i;
}
cout<<"下标访问耗时:\n"<<static_cast<double>(clock()-t_start)/CLOCKS_PER_SEC<<endl;
t_start=clock();
for(int j=0;j<1000;j++){
for(p=x;p!=end;p++) *p=rand();
//for(p=x;p!=end;p++) *p=0;
//for(p=x;p!=end;p++) *p=p-x;
}
cout<<"指针(迭代器)访问耗时:\n"<<static_cast<double>(clock()-t_start)/CLOCKS_PER_SEC<<endl;
free(x);
return 0;
}
最终的测试结果如下:
1)在不使用优化选项时,数组初始化为零的测试结果是:
下标访问耗时:
2.63543
指针(迭代器)访问耗时:
2.09101
而使用了O3优化后的结果是:
下标访问耗时:
0.155942
指针(迭代器)访问耗时:
0.153149
2)在不使用优化选项时,数组用随机数初始化的测试结果是:
下标访问耗时:
10.3164
指针(迭代器)访问耗时:
9.69064
使用O3优化后的结果是:
下标访问耗时:
9.14839
指针(迭代器)访问耗时:
9.11899
3)在不使用优化选项时,数组用下标初始化的测试结果是:
下标访问耗时:
2.79465
指针(迭代器)访问耗时:
2.24019
使用O3优化后的结果是:
下标访问耗时:
0.286373
指针(迭代器)访问耗时:
0.577319
根据测试结果可以看到,在不开优化的情况下,使用指针(迭代器)遍历数组并赋值的效率总是明显快于下标遍历,但是在开启优化后二者的速度差距有所减小,基本还是指针(迭代器)稍快,但是当赋值与当前访问位置有关时,优化后的指针(迭代器)遍历的效率会明显下降,原因可能是指针的减法效率较低。
修改代码,使用额外的int变量记录访问位置后,再进行测试,代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 1000000
int main(){
srand(clock());
int *x=(int*)malloc(N*sizeof(int)),*p,*end=x+N;
clock_t t_start;
t_start=clock();
for(int j=0;j<1000;j++){
for(int i=0;i<N;i++) x[i]=i;
}
cout<<"下标访问耗时:\n"<<static_cast<double>(clock()-t_start)/CLOCKS_PER_SEC<<endl;
t_start=clock();
int i=0;
for(int j=0;j<1000;j++){
for(p=x;p!=end;p++) {*p=i;i++;}
}
cout<<"指针(迭代器)访问耗时:\n"<<static_cast<double>(clock()-t_start)/CLOCKS_PER_SEC<<endl;
free(x);
return 0;
}
这时在优化和优化时二者的测试结果如下:
1)不优化
下标访问耗时:
2.72901
指针(迭代器)访问耗时:
2.58759
2)优化
下标访问耗时:
0.313555
指针(迭代器)访问耗时:
0.290777
可以看到这时依旧是指针(迭代器)较快,因此在进行较大的数组遍历时尽量使用指针(迭代器)进行遍历,尽管可能需要写的代码要多一点,但是相对能够节省一些运行的时间。尤其是要反复进行大型数组遍历的任务中,使用指针(迭代器)可以有比较明显的效率提高。