几种内存遍历写法的效率比较

众所周知,要访问数组中某个变量,有几种方式:
(1)用数组下标;
(2)用指针;


现在有一个很大的数组,要给它的元素逐个赋值(或者遍历),怎样遍历效率较快?看看下面demo:

#include <stdio.h>
#include <opencv.hpp>

void test_accessMemory(){
    double time[10];
    
    int *memory = new int[7680*4320];  // 一幅8K图像
    int *ptr = memory;
    int index = 0;  // 下标索引或指针偏移量

    time[0] = (double)cvGetTickCount();  
    for(int w = 0; w < 7680; w++){       
        for(int h = 0; h < 4320; h++){  // 取下标得到数据
            memory[index] = 1;           
            index++;
        }
    }

    // 重置一下
    index = 0;
    ptr = memory;
    time[1] = (double)cvGetTickCount();  
    for(int w = 0; w < 7680; w++){       
        for(int h = 0; h < 4320; h++){  // 用指针自加, 然后解引用得到数据
            *ptr = 1;                    
            ptr++;
        }
    }

    // 重置一下
    index = 0;
    ptr = memory;
    time[2] = (double)cvGetTickCount();  
    for(int w = 0; w < 7680; w++){      
        for(int h = 0; h < 4320; h++){  // 用指针加上偏移量, 然后解引用得到数据
            *(ptr + index) = 1;     
            index++;
        }
    }

    time[3] = (double)cvGetTickCount();  
    printf("times(ms): [1]%.3f, [2]%.3f, [3]%.3f\n",
            (time[1] - time[0]) / (cvGetTickFrequency() * 1e3),
            (time[2] - time[1]) / (cvGetTickFrequency() * 1e3),
            (time[3] - time[2]) / (cvGetTickFrequency() * 1e3));

    delete[] memory;
}

GCC编译选项加上-O3,在单核CortexA7上跑结果分别是:

times(ms): [1]218.209, [2]66.309, [3]65.774

所以,貌似用指针还是最快的。



一些建议:

根据网友的说法,有以下建议:

(1)用指针变量,比用数组下标效率高。

(2)用寄存器指针,比在静态内存或堆栈中的指针效率高,具体取决于机器。(我试了在本例中没啥变化)

register int *p1,*p2;//寄存器指针变量

(3)小循环放外层。(我试了这个貌似也没有效果)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值