欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 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)小循环放外层。(我试了这个貌似也没有效果)

相关标签: trick

上一篇:

下一篇: