2013-06-01 72 views
18

我注意到,第一次運行腳本時,比第二次和第三次花費的時間要多得多。沒有解釋,提到in this question的「熱身」。我想知道,爲什麼代碼在「預熱」之後運行得更快?在調用之間我不需要clear all,但輸入參數會隨着每個函數調用而改變。有人知道爲什麼嗎?爲什麼腳本「預熱」後Matlab運行速度更快?

+0

一個重要的問題是:你想比較幾個matlab過程*或*你想比較matlab實現與其他人(fortran,c,八度,...)嗎?在第二種情況下,公平比較很難實現。 –

+0

@MarcClaesen:我只比較Matlab進程=) –

+0

也許你也使用在線許可證服務器,就像我們在這裏做的那樣。在這種情況下,只需檢查許可證需要相當長的一段時間。順便說一句。在運行之間「清除所有」時會發生什麼? – Trilarion

回答

8

第一次運行得更快的一個原因是很多事情都被初始化了一次,並且他們的結果被下一次緩存和重用。例如,在M側,變量可以定義爲persistent,其功能可以是locked。這也可能發生在事物的MEX-side

此外,許多依賴關係在第一次之後加載並保留在內存中以便重新使用。這包括M函數,OOP類,Java類,MEX函數等等。這適用於內置和用戶定義的內置。

例如發出以下command之前和運行腳本第一次運行之後,再比較:

[M,X,C] = inmem('-completenames') 

注意clear all不一定clear上述所有的,更何況鎖定功能..

最後讓我們不要忘記加速器的作用。在每次調用函數時都不需要解釋M代碼,而是在運行時將其編譯爲機器代碼指令。 JIT編譯僅在第一次調用時發生,因此理想情況下,在下列時間運行目標代碼的效率將會克服每次運行時重新解釋程序的開銷。

+0

謝謝Amro!如果只有必要的程序在P代碼緩衝區中,而不是所有用於其他函數調用的東西,我不知道它們是否會運行得更快?即在對特定腳本進行基準測試之前,我應該「清除所有」嗎?我沒有注意到一個顯着的不同,但我沒有「填滿」緩衝區... –

+1

Amro,除非你的代碼很小,否則JIT編譯是加速代碼運行的主要效果,加載功能並不重要。而且,JIT編譯不僅發生在第一次調用時--MATLAB有時只會在第一次運行時JIT編譯部分代碼,稍後會進行其他部分的編譯。 @RobertP,如果你需要對代碼進行基準測試,在你引用的問題中鏈接到的'timeit'函數是最好的方法。除其他外,它處理您爲您描述的所有「熱身」問題。 –

+0

@SamRoberts:我同意,這當然是JIT編譯的承諾。如果重複調用一段代碼,我們希望JIT編譯器能夠在運行時檢測到這個「熱點」,並將其優化爲直接的機器代碼。希望即使不是全部都在同一運行中。至於函數加載,我認爲對於加載外部依賴關係的開銷較高的MEX函數來說更是一個問題。 – Amro

2

被解釋。如果你沒有預熱代碼,由於解釋而不是實際的算法,你將會失去很多時間。這可能會嚴重影響計時結果。

運行代碼幾次將使實際編譯適當的代碼段。

0

AmroMarc沒有提及的另一個問題是內存(預)分配。
如果你的腳本沒有預分配它的內存,它的第一次運行將會非常緩慢,因爲內存分配。一旦它完成了第一次迭代,所有的內存都被分配了,所以腳本的連續調用會更有效率。

一個說明性的例子

for ii = 1:1000 
    vec(ii) = ii; %// vec grows inside loop the first time this code is executed only 
end 
+3

@Shai對於預分配是正確的,但是我想對後果持不同意見。這樣做的代碼*寫得很糟糕*。預熱這種代碼會使下一次更快,但在這種情況下*算法很糟糕*。這就是爲什麼我覺得,在這種情況下,熱身實際上扭曲了代碼不佳的優勢,並掩蓋了糟糕的實現! –

+0

@Shai預分配是一件好事,但它對第一次和後續調用具有相同的效果。在你的例子中,'vec'不會只在代碼第一次執行時增長,每次代碼執行時它都會增長。 –

+0

@Shai,對不起,這不是真的,因爲它在腳本中,所以如果你再次運行腳本,'vec'就已經存在。如果它是一個函數,每次代碼執行時都會增長,而不僅僅是第一次。 –

1

除了像JIT編譯特定Matlab的原因,現代CPU具有大容量高速緩存,分支預測等。使用匯編語言進行基準測試也是一個問題。另外,更重要的是,現代CPU通常在低時鐘速度下空閒,並且在幾毫秒的持續負載後才跳到全速。

英特爾的Turbo功能變得更加時髦:當功耗和散熱限制允許時,CPU可以運行得比其可持續最大頻率更快。因此,如果您不小心控制這些因素,那麼您的基準測試的第一次〜20秒到1分鐘的運行速度可能會比其餘的時間快。

相關問題