C++使用指针和下标遍历数组的效率比较

一直很好奇使用指针和下标遍历数组的效率有没有区别,于是测试了一下,总共测试三种遍历情况:
1)给数组每一个元素赋相同的初始值
2)给数组每一个元素赋随机数
3)给数组每一个元素赋当前下标值
三种情况都在g++ 7.0下进行测试,默认使用的C++14标准,分别在默认优化条件(即不加-O情况)和O3优化下进行测试,具体代码如下:

#include 
#include 
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(clock()-t_start)/CLOCKS_PER_SEC<(clock()-t_start)/CLOCKS_PER_SEC<

最终的测试结果如下:
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 
#include 
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(clock()-t_start)/CLOCKS_PER_SEC<(clock()-t_start)/CLOCKS_PER_SEC<

这时在优化和优化时二者的测试结果如下:
1)不优化

下标访问耗时:
2.72901
指针(迭代器)访问耗时:
2.58759

2)优化

下标访问耗时:
0.313555
指针(迭代器)访问耗时:
0.290777

可以看到这时依旧是指针(迭代器)较快,但是实际上我们看到的三个任务的速度差距都仅有百分之几秒,因此大多数情况下究竟选择哪一种遍历方式都差不多,不需要过多的纠结。当然对于强迫症来说,还是用看起来比较快的指针遍历吧。

你可能感兴趣的:(C/C++,高性能计算)