2017-09-22 12 views
1

考慮這兩個功能:朱莉婭 - 爲什麼在模塊中包含變量佔用這麼多內存?

功能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)。爲什麼?

回答

3

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