几种内存遍历写法的效率比较
程序员文章站
2023-12-31 18:44:58
...
众所周知,要访问数组中某个变量,有几种方式:
(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)小循环放外层。(我试了这个貌似也没有效果)