
2022年 C++ Hashmap 綜合效能評測
我更新了 2022 年的 C++ hashmap 綜合評測,針對 29 種不同的 map 與 6 種 hash 進行了 1,914 組組合測試,旨在找出各種使用場景下效能表現最佳的實作方式。
背景
這篇技術文章是作者睽違三年後,針對 C++ Hashmap 效能所做的全面性基準測試更新。作者在 2022 年 8 月評估了 29 種不同的 Hashmap 實作,並結合多種分配器與雜湊函數,總計進行了近兩千場測試,旨在為開發者提供在不同使用場景下(如記憶體穩定性、大數據量插入、字串處理等)的效能參考指標。
社群觀點
在 Hacker News 的討論中,社群成員對於這份基準測試的廣度表示肯定,但也針對特定函式庫的遺漏與測試方法的侷限性展開了深入探討。部分開發者指出,雖然測試涵蓋了許多主流選項,但仍漏掉了一些極具競爭力的實作,例如 Boost 在 2022 年底推出的 unordered_flat_map,該實作利用 SIMD 指令集優化,被認為是目前效能最頂尖的開放定址容器之一。此外,有留言提到 parallel-hashmap 雖然在多執行緒環境下表現優異,但其維護者已建議 C++20 以上的使用者轉向 gtl 庫,而後者已包含在本次測試中。
關於基準測試的本質,社群出現了較為批判性的反思。許多資深工程師強調,微觀基準測試(Microbenchmarks)與實際大型系統的效能表現往往存在落差。在受控環境下表現優異的 Hashmap,可能因為指令快取(icache)佔用過多,在複雜的真實系統中反而拖慢整體速度。更有觀點認為,過度追求 Hashmap 本身的查詢速度有時是捨本逐末,開發者更應關注如何減少查詢次數,或是根據特定數據分佈設計專用的資料結構。
討論中也分享了一些極端的優化案例,例如在處理高達 700GB 的超大型雜湊表時,瓶頸可能不在演算法本身,而是在硬體的 TLB 快取失效。透過將雜湊表分區並分配給特定執行緒處理,可以有效降低 TLB miss 並獲得倍數級的效能提升。最後,關於測試數據的統計方法也引發爭論,有留言質疑作者使用中位數(Median)的做法,認為在基準測試中應取多次執行中的最佳值,以排除作業系統干擾並反映硬體的極限性能。
延伸閱讀
- Boost Unordered Flat Map: 採用 SIMD 技術優化的開放定址雜湊表。
- Parallel Hashmap (greg7mdp): 兼顧執行緒安全與效能的實作,現多推薦轉向 gtl。
- ClickHouse Hash Tables Presentation: 探討雜湊表效能如何受真實數據分佈影響的深度簡報。
- The Delegation Pattern for Datastructures: 關於透過執行緒委派模式優化資料結構存取的學術論文。