2012-09-03 55 views
2

這兩個代碼片段之間會有明顯的速度差異嗎?天真地說,我認爲第二個片段會更快,因爲分支指令遇到的次數要少得多,但另一方面,分支預測器應該解決這個問題。還是會有可觀的開銷,儘管可預測的模式?假定不使用條件移動指令。循環中分支預測的性能

片段1:

for (int i = 0; i < 100; i++) { 
    if (a == 3) 
     output[i] = 1; 
    else 
     output[i] = 0; 
} 

片段2:

if (a == 3) { 
    for (int i = 0; i < 100; i++) 
     output[i] = 1; 
} else { 
    for (int i = 0; i < 100; i++) 
     output[i] = 0; 
} 

我不打算優化這些情況我自己,但我想知道更多有關的開銷甚至以可預測的模式分支。

+4

如果你的編譯器執行的循環外,它們是相同的。 – Fanael

+0

順便說一句,'std :: fill'。 – Fanael

+4

配置文件並查看。 – juanchopanza

回答

3

由於a仍然是不變一旦進入循環,兩個代碼片段之間應該沒有太大的區別。

就個人而言,我更喜歡前者,除非分支預測器未能預測分支真的不太可能,因爲a在循環中保持不變。

此外,編譯器可以執行該優化:

從而代碼片段發射完全相同的機器指令。

1

你問了一個問題的表現沒有指定硬件(儘管從問題中我們可以推斷,它是具有分支預測結構中的一種),工具鏈,或編譯選項。總體而言,這只是另一種空間與速度的折衷,空間本身通常會影響速度(CPU指令和微碼緩存)。

唯一合理的答案是「性能會因處理器硬件和編譯器優化而變化。