在阅读 Julia 的 性能技巧 后,我没有找到有关如何加速三维数组代码的建议。
据我所知,当第三维 d
较小时,d-element Array{Array{Float64,2},1}
的表现最佳。然而,我不确定当 d
较大时是否仍然适用。
是否有关于 Julia 中此主题的教程?
示例1a(d = 50)
x = [zeros(100, 10) for d=1:50];
@time for d=1:50
x[d] = rand(100,10);
end
0.000100 seconds (50 allocations: 396.875 KB)
示例1b(d=50)
y=zeros(100, 10, 50);
@time for d=1:50
y[:,:,d] = rand(100,10);
end
0.000257 seconds (200 allocations: 400.781 KB)
示例2a(d=50000)
x = [zeros(100, 10) for d=1:50000];
@time for d=1:50000
x[d] = rand(100,10);
end
0.410813 seconds (99.49 k allocations: 388.328 MB, 81.88% gc time)
示例2b(d=50000)
y=zeros(100, 10, 50000);
@time for d=1:50000
y[:,:,d] = rand(100,10);
end
0.185929 seconds (298.98 k allocations: 392.898 MB, 6.83% gc time)
xd = x[d]
并在随后的循环中使用x[d][i] = rand()
,是否会有任何区别?如果有,你能解释一下为什么吗? - merchx[d][i]
解除引用两个指针。第二种情况是否被完全优化取决于编译器是否正确地完成了它。或许可以,也或许不行。 - Chris Rackauckasxd
时,您取消引用单个指针。在内部循环的每次迭代中,您再次取消引用单个指针。这是正确的吗?如果我理解正确,您是说最好让编译器仅取消引用单个指针,并且 RecursiveArrayTools.jl 可以自动完成这个过程。 - merchx[d][i]
取决于编译器是否能够识别并优化重写您的循环,就像我展示的那样(因为两个引用比1个慢)。至于它是否在这种情况下执行此操作,我还没有检查。 - Chris Rackauckas