这让我困惑了几个星期,没有人能够给出某种答案。把它作为圣诞礼物,请发布你可能有的任何解释......
我很高兴向学生们展示初始化矩阵(在C中)在完成时速度较慢"在列中明智"。
#define NB_TESTS 100
#define SIZE 512
int M[SIZE][SIZE];
for (int n=0; n<NB_TESTS; n++) {
for (int i=0; i<SIZE; i++) {
for (int j=0; j<SIZE; j++) {
M[j][i] = 0;
}
}
}
比在循环中初始化M[i][j]
的通常版本慢约3倍。
到目前为止一直很好......
这是第一个令人费解的观察。如果我更换
#define SIZE 512
通过
#define SIZE 513
或
#define SIZE 511
差距消失了。
第二个更令人费解的令人费解的观察结果是,在这种情况下,通常的初始化效率不高。我会在2的权力中填补这一点很棒&#34;。 初始化的慢反转版本与正常版本一样快!
你对此采取了什么措施?
备注:
我正在运行debian,
同样的事情发生在gcc(6.3)和clang(3.8)
在堆或堆栈中分配似乎没有什么区别
gcc / clang的优化选项没有什么区别(除了使两个版本更快)
显然,所产生的集合并没有做任何奇怪的事情(同事说)
对于更大的尺寸,正常初始化 更快。对于2的幂而言,反向初始化较慢(SIZE
的{{1}})25%的奇怪事实仍然存在!
以下是我在测试大部分内容时使用的完整代码:
4096