刚刚我了解到 Matlab 和 Octave 使用列优先顺序,来源于 Wikipedia。
Fortran、OpenGL 和 OpenGL ES、MATLAB、GNU Octave、R、Julia、Rasdaman 和 Scilab 都使用列优先顺序。
所以我只是在检查 Matlab 和 Octave 中的“for循环”速度。以下是结果:
Matlab
>> x = rand(10000);
>> tic; for i=1:10000 for j=1:10000 k=x(i,j); end; end; toc; % row-major
Elapsed time is 2.320215 seconds.
>> tic; for i=1:10000 for j=1:10000 k=x(j,i); end; end; toc; % column-major
Elapsed time is 0.433013 seconds.
作为预期,列优先顺序比行优先顺序更快。
Octave
> x=rand(5000);
> tic; for i=1:5000 for j=1:5000 k=x(i,j); end; end; toc; % row-major
Elapsed time is 77 seconds.
> tic; for i=1:5000 for j=1:5000 k=x(j,i); end; end; toc; % column-major
Elapsed time is 78 seconds.
在这两种情况下,结果是相同的。
问题: 为什么Octave中行主循环和列主循环表现相似,尽管它使用列主对齐?
feature accel off
运行测试,我发现行优先和列优先版本之间没有实质性的区别(与您在 Octave 中的结果非常相似)。因此,时间差异在于 JIT 编译,而我猜测非向量化循环不像 JIT 编译器使用的向量化版本那样依赖于矩阵的访问方式。 - David