C++ 最佳化效能策略

最近剛開始看 《Optimized C++》,在開始前有章總結 C++ 最佳化的一些策略,其實就是些很簡單的概念跟實務上的做法,希望後面還會看到些有趣的小技巧。

下面就列出書上提到的策略 (不過標題和筆記都有改過了,跟原文不一樣)

選用好的演算法

  • 常見的排序搜尋操作,挑對演算法即有可觀的效能進步,例如適當選擇 insertion sort O(n²) 和 merge sort O(nlogn)。
  • 有效率且不做不必要的事情是好的演算法的特點。

使用好的資料結構

  • 依據不同類型資料選擇適當的資料結構,例如以資料對插入、排序和讀取的頻繁程度做挑選。
  • 適合的資料結構也能提高記憶體的區域性來提高硬體上的存取速度。

選用好的函式庫

  • 標準函式庫的品質不一定如想像中的好,且為了通用性,內部實作可能並沒有為執行速度作出特別的調整。
  • 了解實作並正確的使用標準函式庫是很重要的。
  • 可以使用 Boost 或 Google 提供的一些公用函式庫來取代標準函式庫,許多第三方的函式庫加進了新功能或是為速度做了調整。例如為了速度犧牲 thread-safe 或是錯誤檢查等。
  • 由於函式庫位於架構底層,對於上層效能會有放大的影響效果。

選用好的 Compiler

  • Compiler 提供許多最佳化參數,別忘記開啟他們 (至少來個 -O2?)。
  • C++11 開提供 rvalue reference 和 move 語意,可以減少複製。
  • C++ 風格在存取成員通常都會包裝 setter/getter,開啟 function inline 很有幫助。
  • 許多 pragmas 可以進一步做最佳化,可以研讀一下。
  • 不同的 compiler 或不同版本具有不同的最佳化能力,通常越新的最佳化能力越強,要錢的也是,例如 Intel C++ compiler。

減少記憶體配置與複製

  • 減少對於 memory manager 的操作是非常有效的最佳化方式,有時靠這招打天下也沒問題。
  • 記憶體配置和複製都可能消耗上千個 CPU 週期,簡單的減少這方面的消耗即可有效的加速程式。(許多時候真的是沒發現但都一直做無用的複製和建構)

減少不必要的計算

  • 不要做沒用的事情 (again)
  • 特別是在迴圈裡重複做事,造成一個 hot zone。
  • 例如 ++i 是比 i++ 有效率的 (但 compiler 貌似已經可以針對這個做最佳化了)

提高併行性

  • 現在電腦多有多和處理器,分配工作同時執行可以更快完成。

記憶體管理優化

  • C++ 提供大量的記憶體管理 API,善用他們。

Reference