朱莉娅 - 为什么在模块中包含变量占用这么多内存?
问题描述:
考虑这两个功能:朱莉娅 - 为什么在模块中包含变量占用这么多内存?
功能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
和包括在testVec2
r
不使用前缀params
,其性能提高立即(同testVec
)。为什么?
答
在params
模块r
是非const
全球性,这使得它的类型不稳定(因为有些功能可以分配r
别的东西,不同类型的)。
将r = 3
替换为const r = 3
并且时间将是相同的。另请参阅Performance Tips的第一部分。
谢谢。有没有办法来检查一个变量是否类型不稳定?例如,一个函数,如'isUnstable()'? – tryingtosolve
做@code_warntype testVec2([1 2 3 4],[2 3 4 5],[3 4 5 6],1000)'给出了很多Julia编译器分配给计算中变量和中间值的类型的信息。注意到任何**红色**任何类型的注释都是一些线索,说明有什么不对劲。 –
@tryingtosolve在'Base.Test'中还有一个'@inferred'宏。 – Gnimuc