最佳化程式碼速度/大綱
外觀
< 最佳化程式碼速度
此作品根據
- Creative Commons 署名許可證 2.5 版 - 或您選擇的任何更高版本。
- 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 核心)
- 寫時複製
- 快取
- 完全避免複製
- 行內函數
- 施瓦茨變換
- 呼籲建立最佳化目錄
- 更改依賴項
- 使用不同的庫或您自己的自編碼例程。
- 切換到更快的語言(或在不同的語言中最佳化關鍵程式碼)。語言層次結構
- 彙編器 > C >= O'Caml > Java, .NET >> Perl, PHP > Python, Ruby, Tcl
- 透過減少功能集來最佳化
- 更少的程式碼 -> 更少的記憶體消耗 -> 更快的程式碼。
- 更少的功能 -> 更少的 if 語句和內容 -> 更快的程式碼。
- 違反“0, 1, 無限”定律。
- 透過在安全性上妥協
- 更少的健全性檢查、輸入檢查等會導致更快的程式碼。
- 不包含大量檢查 malloc() 失敗等錯誤的程式碼執行速度更快,因為它沒有很多錯誤處理。
- “這裡有巨龍”。
- 不包含大量檢查 malloc() 失敗等錯誤的程式碼執行速度更快,因為它沒有很多錯誤處理。
- 更少的健全性檢查、輸入檢查等會導致更快的程式碼。
- 結論
- Eric Sink - 為什麼 Git 如此快?
- 如何編寫快速程式碼?(透過減少工作量)
- Ulrich Drepper - “每個程式設計師都應該瞭解的記憶體” - 第 1 部分,包含指向其他部分的連結。
- “Shavin' Another Second” - 最佳化 File-Find-Object Perl 模組
- Devel::NYTProf 演示 - 概述了有效的分析方法。