C++以高性能著稱,性能優化是C++程序員繞不過去的一個話題,性能優化是一個復雜、全局而又細節的問題,本文總結C++性能分析中常用的知識。
性能優化的時機
大部分關于性能優化的文章都強調:不要過早的進行性能優化。
C++編碼層面
數據結構和算法
選擇最優的數據結構和算法是保證程序性能的基礎。
為了極致的性能,有時候還需要根據實際業務定義自己的數據結構和算法。
避免不必要的復制
內聯函數
常量表達式
使用 constexpr
使得表達式在編譯時計算。
constexpr int square(int x) { return x * x; }int main() {int result = square(5); // 編譯時計算return 0;
}
避免不必要的類型轉換
避免頻繁的類型轉換,特別是盡量避免使用 dynamic_cast
,尤其是在性能關鍵路徑中。
class Base { public: virtual void doSomething() {} };
class Derived : public Base { public: void doSomething() override {} };int main() {Base* base = new Derived();Derived* derived = static_cast<Derived*>(base); // 使用 static_cast 避免動態類型轉換derived->doSomething();delete base;return 0;
}
使用移動優化
……
硬件層面
內存管理
頻繁的內存分配和釋放導致性能下降,使用內存池來預分配一塊大內存區域,避免多次分配和釋放內存。
#include <vector>class MemoryPool {
public:
void* allocate(size_t size) {}void deallocate(void* ptr) {}private:
std::vector<void*> freeList;
};
優化常用操作
條件分支導致 CPU 分支預測失敗,可以優化代碼中條件分支的順序,避免分支預測失敗。
for (int i = 0; i < 1000; ++i) {if (i % 2 == 0) {// 一部分代碼,高頻的部分可以放在前面} else {// 另一部分代碼}
}
編譯器優化
充分相信編譯器是聰明到了極致,而不是自作聰明的去揣測編譯器
并性編程
多線程 并行執行任務,充分利用多核 CPU。
CPU緩存優化
數據訪問順序導致緩存未命中,影響性能,調整內存訪問順序,增加數據的局部性。如下為經典示例
const int SIZE = 10000;
int arr[SIZE][SIZE];// 訪問順序優化,按列訪問時可能導致緩存未命中
for (int j = 0; j < SIZE; ++j) {for (int i = 0; i < SIZE; ++i) {arr[i][j] = i * j;}
}// 更好的訪問順序,按行訪問
for (int i = 0; i < SIZE; ++i) {for (int j = 0; j < SIZE; ++j) {arr[i][j] = i * j;}
}