Matlab嵌套循环顺序对运行速度的影响:版本1与版本2孰快?
哪个Matlab循环版本运行速度更快?
结论:版本2的运行速度会显著快于版本1
原因要从Matlab的内存存储机制和CPU缓存命中率说起:
Matlab采用**列优先(column-major)**的内存存储顺序,简单来说,数组的元素会按照“先遍历第一维度,再第二维度,最后第三维度”的顺序连续存储在内存中。对于你的三维数组bigArray[npolv, nz, nsv],元素bigArray(a,b,c)的线性内存位置计算公式是:
linear_index = (c-1)*npolv*nz + (b-1)*npolv + a;
现在来看两个版本的循环行为:
- 版本1:外层循环
j(对应第二维度nz),内层循环qq(对应第三维度nsv)。当j固定时,每次qq递增,你赋值的bigArray(:,j,qq)在内存中是间隔非常远的块(间隔大小为npolv*nz个元素,换算成字节约44MB,远大于CPU缓存的常规容量)。这意味着CPU每次都要从主存重新读取数据,缓存命中率极低,运行速度自然慢。 - 版本2:外层循环
qq(对应第三维度nsv),内层循环j(对应第二维度nz)。当qq固定时,j递增,你赋值的bigArray(:,j,qq)是连续的内存块(每个块大小约538KB,完全可以被CPU缓存覆盖)。CPU可以预加载连续的内存区域,缓存命中率极高,赋值操作的效率会大幅提升。
举个直观的例子:把内存想象成一排连续的抽屉,版本1是每隔44MB跳一个抽屉放东西,版本2是挨着抽屉依次放,显然后者效率更高。
如果想进一步优化,你还可以尝试将循环向量化(比如直接生成整个维度的结果再赋值),但仅调整循环顺序就已经能获得非常可观的性能提升了。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

