我最近发表了一条评论如下:
多维数组需要花费大量时间进行数组访问。为了提高缓存和访问速度,建议保持索引从小到大,即声明
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
。
两个数组实现之间如此大的执行时间差异可能是什么原因?
答案 0 :(得分:2)
这正是行主要和列主要有序矩阵之间的区别。
差异在Wikipedia上解释:
在行主要顺序中,数组行的连续元素在内存中是连续的;在列主要顺序中,列的连续元素是连续的。
C和C ++是行主要的,因此它们可以利用空间的局部性来利用行的缓存。这解释了加速的显着增加。
从技术上讲,如果您想节省大量时间,最好将多维数组表示为1D数组。 :)