首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

對象池性能實測:vector/queue vs list,裸指針基準對比

     編輯:C++ 入門

結論先行

對象池本質是管理指針容器,**容器選型決定性能上限**。實測:vector/queue 實現的對象池性能接近裸指針管理,list 明顯慢 3-5 倍。

測試代碼核心邏輯

template<typename Pool>
void benchmark(Pool& pool, int iterations) {
    auto start = std::chrono::high_resolution_clock::now();
    for (int i=0; i<iterations; ++i) {
        auto* obj = pool.pop();
        // 模擬使用
        pool.push(obj);
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << "ms\n";
}

三種實現對比

容器數據結構push/pop 複雜度緩存友好實測相對耗時
std::vector (作棧用)動態陣列O(1) 攤還⭐⭐⭐⭐⭐1.0x (基準)
std::queue (底層 deque)分段連續陣列O(1)⭐⭐⭐⭐1.1x
std::list雙向鏈表O(1)⭐ (節點分散)3.5x ~ 5x

關鍵優化點

  1. 預留容量:pool.reserve(max_size) 避免擴容拷貝
  2. 對象復用而非銷毀重建:pop() 返回對象指針,push() 回收,構造/析構只在池創建/銷毀時發生
  3. 避免虛函數調用:熱路徑使用模板靜態多態

生產級建議

  • 單線程:vector 做棧(LIFO)最快
  • 多線程:無鎖環形隊列或 moodycamel::ConcurrentQueue
  • 大對象:池化 std::unique_ptr<T> 而非 T 本身
  • 監控指標:命中率、平均延遲、內存佔用峰值

代碼片段:高性能 vector 池

template<typename T>
class ObjectPool {
    std::vector<T*> _free;
public:
    ObjectPool(size_t capacity) { _free.reserve(capacity); }
    T* acquire() {
        if (_free.empty()) return new T();
        T* p = _free.back(); _free.pop_back(); return p;
    }
    void release(T* p) { _free.push_back(p); }
    ~ObjectPool() { for (auto p : _free) delete p; }
};
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved