嵌套循环速度的matlab阶

嵌套循环速度的matlab阶,matlab,performance,nested-loops,Matlab,Performance,Nested Loops,假设我有以下代码。是版本1还是版本2更快?更改的是两个嵌套循环的顺序 版本1 % bigArray has dim: [npolv,nz,nsv] % npolv=68961 > nsv=200 > nz=81 for j=1:nz for qq=1:nsv % the output of fun is a vector dim npolv bigArray(:,j,qq) = fun(); end end 或版本2 % bigArray h

假设我有以下代码。是版本1还是版本2更快?更改的是两个嵌套循环的顺序

版本1

% bigArray has dim: [npolv,nz,nsv]
% npolv=68961 > nsv=200 > nz=81
for j=1:nz
   for qq=1:nsv
       % the output of fun is a vector dim npolv
       bigArray(:,j,qq) = fun();
   end
end
或版本2

% bigArray has dim: [npolv,nz,nsv]
% npolv=68961 > nsv=200 > nz=81
for qq=1:nsv
    for j=1:nz
        % the output of fun is a vector with dim npolv
        bigArray(:,j,qq) = fun();
    end
end

如果分配向量
bigArray=0(DIM、nz、nsv)
,则没有实际差异

在这两种情况下,函数
fun()
按顺序执行
nz*nsv


相反,使用
tic
t=toc
检查每个可能性的计时,并使用
parfor
进行并行执行

版本2很可能比版本1快,这是因为Matlab在内存中存储数据的方式(按列,或者更准确地说,最左边的索引变化最快并存储在连续的内存位置)和内存缓存的效果(一次获取一页内存[例如,4KB=500
double
元素])。这就是所谓的空间位置,或原则。通过在左索引之前循环最右边的索引,我们可以最大限度地提高CPU缓存的效率,因为CPU不需要经常访问主内存(RAM)来获取连续的数据项

对于小数据矩阵,这种影响通常很小或很小,但当数据大小大于平台的页面大小时,这种影响可能会很明显-在这种情况下,与版本1相比,版本2可以看到2倍甚至更多的加速


话虽如此,如果你能使你的
有趣()
矢量化,潜在的加速比切换循环顺序的加速要大得多。

我不认为会有任何明显的区别,但使用tic和toc来测量它。可能会有差异,因为内存中数组的顺序不同,但我同意@JakobL的观点,真正判断的唯一方法是测量它。实际上,两个可能更快,但这取决于第一维度的大小,以及
乐趣的成本。量,量,量。