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

一直很好奇使用指针和下标遍历数组的效率有没有区别,于是测试了一下,总共测试三种遍历情况:
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

可以看到这时依旧是指针(迭代器)较快,因此在进行较大的数组遍历时尽量使用指针(迭代器)进行遍历,尽管可能需要写的代码要多一点,但是相对能够节省一些运行的时间。尤其是要反复进行大型数组遍历的任务中,使用指针(迭代器)可以有比较明显的效率提高。

猜你喜欢

转载自blog.csdn.net/artorias123/article/details/85605628