改善分支的可預測性可能會給程式碼的效能帶來明顯的影響。
在以下情況中,此細節具有實質性意義:
計數器的比率(失效的分支預測失誤/失效的微操作)不佳。值 0.005 應視為良好,值 0.025 應視為不佳。
考慮使用“英特爾(R) 編譯器”的“檔案導引基本指令塊優化”(PGBO) 選項重新調整基本指令塊結構,使產生的分支更少。
考慮使用“英特爾編譯器”選項 -Qxi,將分支指令替換成 cmov 與 fcmov 指令。
設計程式碼以改善分支可預測性。
確保每條 CALL 指令都有匹配的 return。
避免混用數據與指令。
展開非常短的循環。
分支基於隨機預測的數據時,請考慮使用條件 MOV 指令、“數據流單指令多數據擴充套件指令集”(SSE) 或“MMX(TM) 技術”指令修改程式碼以避免分支。
例如,將以下程式碼:
if (a>0)
c=x
else
c=y
更改成以下版本:
int val [2]={x,y};
c=val[a>0];
在彙編程式碼中,可以考慮將分支指令替換成 cmov、fcmov 及 setcc 指令,從而消除它們。此外在有些情況下,您還可以使用 SIMD 比較(建立掩碼)與邏輯指令(與/或/非),以布爾運算執行操作。如需檢視示例,請參閱“MMX(TM) 技術概述”文件中的“色度鍵控”部分,此文件可以在 http://developer.intel.com 上找到。