2013-06-13 61 views
1

我試圖加速一個運行約100000次迭代的循環,並想知道if語句的順序是否對性能有影響。例如,下面的代碼會在每次執行for循環時執行else語句之前檢查if和elseif嗎?MATLAB:If語句的順序是否影響性能

for ii = 1:100000 

    if ii == 1 
     statements_1; 
    elseif ii >= 2 && ii <= 10 
     statements_2; 
    else 
     statements_3; 
    end 
end 

下面的代碼運行速度會更快嗎?

for ii = 1:100000 

    if ii > 10 
     statements_3; 
    elseif ii >= 2 && ii <= 10 
     statements_2; 
    else 
     statements_1; 
    end 
end 

任何幫助將非常感激

+4

在IF/elseifs,先放置的條件應該是一個鏈你期望成爲最有可能成功的人,第二個條件應該是第二個最有可能成功的條件,等等。 – Patashu

+0

爲防萬一您沒有意識到這一點,請查看定時功能的'tick'和'tock'命令。它們對於優化非常有用! MATLAB也有一個很好的分析器,但這在這裏沒有多大幫助。 – chessofnerd

+3

@chessofnerd'tic'和'toc',no'k'。 –

回答

4

是的,它會檢查的首要條件拳頭,然後如果是假的,它會檢查以下條件。

然而,爲了提高性能,我建議你使用更量化代碼:

for i=find(condition1(1:10000)) 
    statements1 
end 

for i=find(condition2(1:10000)) 
    statements2 
end 

for i=find(condition3(1:10000)) 
    statements3 
end 

與例如[email protected](i) (i>2 & i<10)

+2

如果'statement3(i)'不是'statement2(j)'或'statement1(k)'的函數,即遞歸關係,那麼這個矢量化版本才真正適合。否則,你需要傳遞數據來完成這項工作。 – horchler

+0

+1這是一個潛在的非常有用的MATLAB編程模式。 –

+0

我很抱歉,但我相信你的解決方案比原來的單一循環慢得多。原因在於,在現代ML版本中,JITC /加速器能夠近似向量化循環,而在您的解決方案中,您重複循環三次,每次在整個向量上使用find(),這在內存分配/ dealloc和CPU。嘗試一下,看看自己。 更好的解決方案是完全矢量化循環(即,如果可能的話,刪除「for」關鍵字的使用)。 –

相關問題