朱莉娅 - 为什么在模块中包含变量占用这么多内存?

问题描述:

考虑这两个功能:朱莉娅 - 为什么在模块中包含变量占用这么多内存?

功能1:

function testVec(t,v,k,n) 
    for i=1:n 
     t .= v .* 3 .+ k .* 4; 
    end 
end 

功能2:

module params 
r = 3; 
end 

function testVec2(t,v,k,n) 
    for i=1:n 
     t .= v .* params.r .+ k .* 4; 
    end 
end 

他们有完全不同的表现:

@time testVec([1 2 3 4], [2 3 4 5], [3 4 5 6], 1000) 
0.000036 seconds (7 allocations: 496 bytes) 

@time testVec2([1 2 3 4], [2 3 4 5], [3 4 5 6], 1000) 
0.003180 seconds (4.01 k allocations: 141.109 KiB) 

为什么包括参数r在一个月这会让功能变差吗?

如果我export模块params和包括在testVec2r不使用前缀params,其性能提高立即(同testVec)。为什么?

params模块r是非const全球性,这使得它的类型不稳定(因为有些功能可以分配r别的东西,不同类型的)。

r = 3替换为const r = 3并且时间将是相同的。另请参阅Performance Tips的第一部分。

+0

谢谢。有没有办法来检查一个变量是否类型不稳定?例如,一个函数,如'isUnstable()'? – tryingtosolve

+2

做@code_warntype testVec2([1 2 3 4],[2 3 4 5],[3 4 5 6],1000)'给出了很多Julia编译器分配给计算中变量和中间值的类型的信息。注意到任何**红色**任何类型的注释都是一些线索,说明有什么不对劲。 –

+2

@tryingtosolve在'Base.Test'中还有一个'@inferred'宏。 – Gnimuc