我正在尝试通过预先分配数组来最小化Julia中的内存分配,如文档中所示。我的示例代码如下:
using BenchmarkTools
dim1 = 100
dim2 = 1000
A = rand(dim1,dim2)
B = rand(dim1,dim2)
C = rand(dim1,dim2)
D = rand(dim1,dim2)
M = Array{Float64}(undef,dim1,dim2)
function calc!(a, b, c, d, E)
@. E = a * b * ((d-c)/d)
nothing
end
function run_calc(A,B,C,D,M)
for i in 1:dim2
@views calc!(A[:,i], B[:,i], C[:,i], D[:,i], M[:,i])
end
end
我的理解是,由于M
在两个函数之外被预先分配,因此这应该本质上不会再进行分配。然而,当我对此进行基准测试时,仍然看到了大量的分配:
@btime run_calc(A,B,C,D,M)
1.209毫秒(14424次分配:397.27 KiB)
在这种情况下,我当然可以运行更简洁的代码
@btime @. M = A * B * ((D-C)/D)
这段代码只期望执行非常少的内存分配:
122.599 微秒 (6 次内存分配:144 字节)
然而,我的实际代码更复杂,无法像这样简化,因此我想知道第一个版本哪里出了问题。