2013-06-19 59 views
1

Matlab是否使用分支預測來提高性能?也就是說,如果我們將這些陳述展示出來:Matlab中的分支預測

if a > 0 
    b = b + 1 
end 

... 

b = b + (a > 0) 

它會加快速度嗎?

PS:我不明白,這個具體的例子可能永遠不會在任何語言中加快速度,但想象更復雜的東西,即與嵌套,如果公司或多個條件幾個else語句...

+2

什麼具體問題激勵你問這個問題? –

+1

這是一個普遍的問題,我想盡可能地給出答案:)我只是想知道,我用於C++的那些優化原則是否適用於此處以及程度如何。 – sashkello

+0

聽起來像是我過早的優化 - 你應該測量/配置文件的性能,只有當你確定了一個特定的瓶頸,然後看看如上所述的微觀優化。 –

回答

4

當然,如果你有類似的東西

if a > 0 
    b = b + <outcome of some super time consuming calculation> 
end 

... 

b = b + (a > 0) * <outcome of some super time consuming calculation> 

第一個案件將贏得雙手下降。顯然,你應該如何構建你的代碼。

但是對於比較簡單的情況,例如您建議的情況,唯一的辦法就是查看配置文件。

clc 

N = 1e2; 


tend = 0; 
for ii = 1:N 
    tstart = tic; 
    b = 0; 
    for jj = 1:1e5 
     a = randn; 
     if a > 0 
      b = b + 1; 
     end 
    end 
    tend = tend + toc(tstart); 
end 
tend/N 


tend = 0; 
for ii = 1:N 
    tstart = tic; 
    b = 0; 
    for jj = 1:1e5 
     a = randn; 
     b = b + (a > 0); 
    end 

    tend = tend + toc(tstart); 
end 
tend/N 

首先運行:

ans = 
    1.000391000000000e-02 
ans = 
    5.645930000000001e-03 

第二輪:

ans = 
    5.761880000000000e-03 
ans = 
    5.599670000000002e-03 

第三輪:

ans = 
    6.127599999999998e-03 
ans = 
    5.800120000000002e-03 

等。

所以,是的,那裏似乎是一個性能損失,由於分支,雖然我們不能確定它實際上是由於分支預測怪癖或MATLAB的解釋器/ JIT做一些奇怪的與if-else結構...

由於總是,如果它的性能和細節控制你想要的,不要使用MATLAB,使用C.這種事情根本不是什麼MATLAB的。

+2

您的第一個陳述*'第一個案件將贏得雙手'*,並非總是如此(由於解釋)。我的理解是:事前是真實的,但如果重複多次,則耗時的計算在第二種情況下只能進行一次。 – Oleg

+0

@OlegKomarov:我當然假設,對於這兩種情況(例如'(a> 0)。* <結果向量>',儘可能以最好的方式實現耗時的計算,在那種情況下,*會*在結果向量中進行無用的計算(最好的情況,與'if'相同,最壞的情況,所有的都被浪費了*)。當然,這些損失並沒有超過比較的結果。 –

+0

您是否嘗試交換這兩個代碼塊?有時它很重要(我不知道爲什麼,但確實如此)。 – sashkello