2013-08-27 135 views
-4

如果我這樣做...if語句極其緩慢的循環

vector< array<double,2> > magT(magnitude.size(), array<double,2>()); 

for (int n = 0; n < magnitude.size()-amount; n++) { 
    for (int chan = 0; chan < channels; chan++) { 

     for (int m = 0; m < amount; m++) { 
      magT.at(n).at(chan) += magnitude.at(n+m).at(chan); 
     } 

     magT.at(n).at(chan) /= amount; 
    } 
} 

magnitude = magT; 

...其快如閃電。但是,如果我添加幾個if語句是這樣的...

vector< array<double,2> > magT(magnitude.size(), array<double,2>()); 

int upper = ceil(amount/2); 
int lower = floor(-amount/2); 

for (int n = 0; n < magnitude.size(); n++) { 
    for (int chan = 0; chan < channels; chan++) { 

     for (int m = lower; m < upper; m++) { 
      m = n+m < 0 ? 0 : m; 
      m = n+m > magnitude.size()-1 ? 0 : m; 
      magT.at(n).at(chan) += magnitude.at(n+m).at(chan); 
     } 

     magT.at(n).at(chan) /= amount; 
    } 
} 

magnitude = magT; 

...它數百次慢,甚至千計。邏輯表述真的很慢嗎?我應該讓他們脫離這樣的嵌套循環嗎?如果是這樣,我該如何合理地完成這樣的事情?

+9

這是因爲您有條件重置'for'循環('m = 0;')** not **,因爲'if'語句。 – trojanfoe

+0

Doh!謝謝... –

+1

您還可以在所有for循環外計算'magnitude.size()'。任何可以在三重嵌套循環之外進行計算的東西應該是。 – asimes

回答

1

這裏slownes的原因可能是處理器流水線的設計。通常處理器會預測未來的指令(並開始它的指令),但如果預測指標錯誤,則一切變得緩慢(因爲處理器必須忘記預先計算的結果)。

因此,最好是避免「如果」循環中的指令。

有時候最好寫 m =(n + m < 0)? 0:m; 而不是 如果(n + m < 0)m = 0; (這裏的一切都取決於你的編譯器的優化選項,所以有時這個推薦不起作用)。