跳轉到內容

最佳化程式碼速度/大綱

來自華夏公益教科書,開放的書籍,開放的世界

此作品根據

  1. Creative Commons 署名許可證 2.5 版 - 或您選擇的任何更高版本。
  2. GNU 自由文件許可證 1.2 版 - 或您選擇的任何更高版本。

請保持這種方式。如果您不喜歡任何或所有許可證 - 請隨時將其分叉並擁有不同的派生許可證。(在適當接受任一許可證的條款作為起點的同時)。

作者:User:Shlomif

最佳化程式碼速度 - 大綱

[編輯 | 編輯原始碼]
  • 介紹
    • 在什麼型別的程式中需要最佳化?
    • 何時最佳化?
    • 何時不最佳化?
  • 最佳化指南
    • 確保您有自動化測試,並且覆蓋率良好。(這樣在過程中就不會出現問題,並且可以為分析器提供素材)。
    • 確保您的程式碼足夠模組化。
    • 使用分析器進行分析。
    • 程式碼審查。
  • 複雜度最佳化順序
    • 解釋
    • 什麼是複雜度?
    • 降低複雜度
      • 例子
        • 查詢應明顯小於 O(n)
        • 使用平衡二叉樹代替排序陣列。
        • 使用雜湊表代替平衡二叉樹
        • 計數排序/基數排序
        • Joel on Software 的 Back to Basics' Shlemiel's the Painter 綜合症 - O(n^2) 而不是 O(n)
      • 證明演算法是最低複雜度的。
    • 複雜度最佳化逆序 - 有時更低複雜度的演算法會有更大的因子
      • 中位數 O(N) 演算法 - 通常 O(N*log(N)) 排序會更可取。
      • 對大型物件進行計數排序。
  • 因子最佳化
    • 什麼是因子最佳化?
    • 因子最佳化的動機
    • 例子
      • 使用指向結構體的指標而不是結構體陣列
      • 減少記憶體消耗。
        • 關於記憶體/速度權衡“神話”的說明。
      • 並行化
        • 關於阿姆達爾定律的說明。
      • 將最常用的變數放在結構體的開頭。(Linux 核心)
      • 寫時複製
      • 快取
      • 完全避免複製
      • 行內函數
      • 施瓦茨變換
    • 呼籲建立最佳化目錄
  • 更改依賴項
    1. 使用不同的庫或您自己的自編碼例程。
    2. 切換到更快的語言(或在不同的語言中最佳化關鍵程式碼)。語言層次結構
      • 彙編器 > C >= O'Caml > Java, .NET >> Perl, PHP > Python, Ruby, Tcl
  • 透過減少功能集來最佳化
    • 更少的程式碼 -> 更少的記憶體消耗 -> 更快的程式碼。
    • 更少的功能 -> 更少的 if 語句和內容 -> 更快的程式碼。
      • 違反“0, 1, 無限”定律。
    • 透過在安全性上妥協
      • 更少的健全性檢查、輸入檢查等會導致更快的程式碼。
        • 不包含大量檢查 malloc() 失敗等錯誤的程式碼執行速度更快,因為它沒有很多錯誤處理。
          • “這裡有巨龍”。
  • 結論

考慮新增的資源

[編輯 | 編輯原始碼]
華夏公益教科書