为什么这两个多维数组的实现之间存在如此大的执行时间差异?

时间:2016-06-21 16:14:43

标签: c++ arrays performance multidimensional-array

我最近发表了一条评论如下:

  

多维数组需要花费大量时间进行数组访问。为了提高缓存和访问速度,建议保持索引从小到大,即声明rmq数组,如rmq[11][11][1002][1002]而不是rmq[1002][1002][11][11]

我尝试了一个代码来测试它。在代码1中:

int pre_compute[18][100001];    //global variable

int main(){
    /*some precomputations on pre_compute array 
    of the order of size of the array*/

    /*Run 10^8 queries on pre_compute array,
    O(1) per query.*/
}

代码2:

int pre_compute[100001][18];    //global variable

int main(){
    /*exact same precomputations on pre_compute array as done in Code 1 
    of the order of size of the array*/

    /*Run 10^8 queries on pre_compute array,
    O(1) per query.*/
}

除了阵列的分布外,两个代码都是相同的。两个代码之间仍有很大的执行时间差异。第一个代码在我的PC上平均为0.40 secs,而其他代码平均为1.42 secs

两个数组实现之间如此大的执行时间差异可能是什么原因?

1 个答案:

答案 0 :(得分:2)

这正是行主要和列主要有序矩阵之间的区别。

差异在Wikipedia上解释:

  

在行主要顺序中,数组行的连续元素在内存中是连续的;在列主要顺序中,列的连续元素是连续的。

C和C ++是行主要的,因此它们可以利用空间的局部性来利用行的缓存。这解释了加速的显着增加。

从技术上讲,如果您想节省大量时间,最好将多维数组表示为1D数组。 :)