首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言階乘迴圈效率:遞減迴圈編譯優化優於遞增

     編輯:程式設計綜合問答

對比兩種寫法:

// 遞增
for (i=1; i<=limit; i++) fact *= i;
// 遞減
for (i=limit; i!=0; i--) fact *= i;

編譯器優化後匯編差異 (x86-64, -O3)

; 遞增版 (fact1) - 4 條指令循環體
.L4:
    imull %eax, %edx      ; fact *= i
    addl $1, %eax         ; i++
    cmpl %edi, %eax       ; cmp i, limit
    jne .L4               ; 跳轉

; 遞減版 (fact2) - 3 條指令循環體
.L14:
    imull %eax, %edx      ; fact *= i
    subl $1, %eax         ; i--
    jne .L14              ; 直接利用 ZF 標誌跳轉

核心差異

  • 遞增:需額外 cmpl 比較 i 與 limit (兩個寄存器/內存值)。
  • 遞減:subl 後結果為 0 直接設置零標誌 (ZF),jne 僅檢查 ZF,無需額外比較指令。

效率結論

  • 循環體指令數:遞減 3 條 < 遞增 4 條。
  • 現代 CPU 流水線/分支預測下,遞減版略快 (約 5-10%)。
  • 編譯器 -O2/-O3 會自動將簡單計數迴圈優化為遞減形式 (Loop Inversion/Strength Reduction)。

實戰建議

  1. 手寫代碼時傾向遞減迴圈 (如 for (int i=n; i--;) 或 while(n--))。
  2. 複雜邊界條件時以可讀性優先,編譯器會優化。
  3. 關鍵熱點路徑可檢查反匯編確認優化效果。
  4. 遞減迴圈利用零標誌消除比較指令,是經典的編譯器優化友好模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved