一般来说,步幅是指穿过某物的距离。
\n在里面addition例程中,我们有这些循环:
for (long i = 0; i < COLS; i++)\n for (long j = 0; j < ROWS; j++) {\n sum += table[j][i];\n }\nRun Code Online (Sandbox Code Playgroud)\n在第一次迭代中j等于的最内层循环的连续迭代中,一次迭代访问,下一次迭代访问。这两个访问之间的距离是 1 的大小,即(2000) 个元素xtable[x][i]table[x+1][i]table[j]COLSshort(可能是两个字节),因此可能是 4000 个字节。所以步长是 4000 字节。
这通常对典型处理器上的高速缓存不利,因为高速缓存主要是为彼此接近的内存访问(小步长)而设计的。这就是程序\xe2\x80\x99s性能缓慢的原因。
\n由于循环 中的操作与所有和sum += table[j][i];的执行顺序无关,因此我们可以通过交换两个语句来轻松解决此问题:ijfor
for (long j = 0; j < ROWS; j++)\n for (long i = 0; i < COLS; i++)\n sum += table[j][i];\nRun Code Online (Sandbox Code Playgroud)\n然后,最内层循环的连续迭代将访问table[j][x]和table[j][x+1],其步长为 1 short,可能是两个字节。
在我的系统上,经过此更改,程序的运行速度提高了大约二十倍。
\n