std__map,std__unordered_map,protobuf__map之間的性能比較

簡單比較下 std::map、std::unordered_map 和 protobuf::Map 的性能,主要關注在 插入、查找 和 刪除 操作上的效率以及內存管理的差異。

std::map

  • 底層實現:std::map 使用紅黑樹作為底層數據結構,紅黑樹是一種平衡二叉查找樹的變體結構,它的左右子樹的高度差有可能會大于 1。所以紅黑樹不是嚴格意義上的平衡二叉樹AVL,但對之進行平衡的代價相對于AVL較低, 其平均統計性能要強于AVL。紅黑樹具有自動排序的功能,因此它使得map也具有按key排序的功能,因此在map中的元素排列都是有序的。在map中,紅黑樹的每個節點就代表一個元素,因此實現對map的增刪改查,也就是相當于對紅黑樹的操作。對于這些操作的復雜度都為O(logn),復雜度即為紅黑樹的高度。
  • 插入、查找、刪除性能:由于是有序的,對于大數據量場景,樹結構的操作時間更長。
  • 內存管理:std::map 內存占用較高,因為紅黑樹的每個節點都需要額外的指針存儲,且樹的平衡機制需要更多的內存管理。
  • 適用場景:顯然std::map 適合需要數據有序存儲的情況。

std::unordered_map

  • 底層實現:std::unordered_map 使用哈希表(hash table)作為底層數據結構,平均操作時間復雜度為 O(1),但最差情況下可能退化到 O(n)。key值是無序的。
  • 插入、查找、刪除性能:在平均情況下,std::unordered_map 的性能通常優于 std::map,適合頻繁的插入和查找操作。
  • 內存管理:哈希表在空間分配上通常會預分配一部分空間,以減少重哈希和再分配的頻率。不過當哈希碰撞較多時,內存消耗會增加。
  • 適用場景:std::unordered_map 適合不關心順序,但需要高效查找和插入操作的場景。

protobuf::Map

  • 底層實現:protobuf::Map 的具體實現網上搜索不到,但基于官方的Protobuf 文檔(https://protobuf.dev/reference/cpp/api-docs/google.protobuf.map/), std::unordered_map,使用了哈希表來實現。
  • 插入、查找、刪除性能:protobuf::Map 在 Protobuf 序列化、反序列化場景中的性能優于 std::map 和 std::unordered_map,因為它直接支持二進制序列化,減少了額外的序列化和轉換成本。
  • 內存管理:protobuf::Map 為序列化和反序列化進行內存管理優化,減少了 Protobuf 數據格式和 C++ 容器之間的冗余轉換,因此在存儲大數據集或頻繁數據交換時,內存消耗更低。
  • 適用場景: 相比 std::map 和 std::unordered_map,對于不在乎順序的場景而言,protobuf::Map 與 std::unordered_map性能差不多,但考慮到序列化時間和內存占用,直接使用protobuf::Map可能會比較合適。

參考資料

  • https://protobuf.dev/reference/cpp/api-docs/google.protobuf.map/
  • https://stackoverflow.com/questions/3902644/choosing-between-stdmap-and-stdunordered-map
  • https://www.geeksforgeeks.org/map-vs-unordered_map-c/
  • https://medium.com/@yakupcengiz/comparing-std-map-and-std-unordered-map-in-c-92aa18c5dc39
  • chatgpt answer:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83729.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文檔處理組件Aspose.Words 25.5全新發布 :六大新功能與性能深度優化

在數字化辦公日益普及的今天,文檔處理的效率與質量直接影響到企業的運營效率。Aspose.Words 作為業界領先的文檔處理控件,其最新發布的 25.5 版本帶來了六大新功能和多項性能優化,旨在為開發者和企業用戶提供更強大、高效的文檔處理能力。 六…

Three.js + Vue3 加載GLB模型項目代碼詳解

本說明結合 src/App.vue 代碼,詳細解釋如何在 Vue3 項目中用 three.js 加載并顯示 glb 模型。 1. 依賴與插件導入 import {onMounted, onUnmounted } from vue import * as THREE from three import Stats from stats.js import {OrbitControls } from three/examples/jsm/co…

Flutter如何支持原生View

在 Flutter 中集成原生 View(如 Android 的 SurfaceView、iOS 的 WKWebView)是通過 平臺視圖(Platform View) 實現的。這一機制允許在 Flutter UI 中嵌入原生組件,解決了某些場景下 Flutter 自身渲染能力的不足&#x…

vue-11(命名路由和命名視圖)

命名路由和命名視圖 命名路由和命名視圖提供了組織和導航 Vue.js 應用程序的強大方法,尤其是在它們的復雜性增加時。它們提供了一種語義更合理、可維護的路由方法,使您的代碼更易于理解和修改。命名路由允許您按名稱引用路由,而不是依賴 URL…

微軟認證考試科目眾多?該如何選擇?

在云計算、人工智能、數據分析等技術快速發展的今天,微軟認證(Microsoft Certification)已成為IT從業者、開發者、數據分析師提升競爭力的重要憑證。但面對眾多考試科目,很多人不知道如何選擇。本文將詳細介紹微軟認證的考試方向、…

視頻匯聚平臺EasyCVR“明廚亮灶”方案筑牢旅游景區餐飲安全品質防線

一、背景分析? 1)政策監管剛性需求?:國家食品安全戰略及 2024年《關于深化智慧城市發展的指導意見》要求構建智慧餐飲場景,推動數字化監管。多地將“AI明廚亮灶”納入十四五規劃考核,要求餐飲單位操作可視化并具備風險預警能力…

Mysql莫名奇妙重啟

收到客戶反饋有時接口報504,查看應用日志發現故障期間數據庫連接失敗 com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not receive…

半監督學習:低密度分離假設 (Low-Density Separation Assumption)

半監督學習(SSL)的目標是借助未標記數據輔助訓練,以期獲得比僅用帶標簽的監督學習范式更好的效果。但是,SSL的前提是數據分布需滿足某些假設。否則,SSL可能無法提升監督學習的效果,甚至會因誤導性推斷降低預測準確性。 半監督學習…

Python Day44

Task: 1.預訓練的概念 2.常見的分類預訓練模型 3.圖像預訓練模型的發展史 4.預訓練的策略 5.預訓練代碼實戰:resnet18 1. 預訓練的概念 預訓練(Pre-training)是指在大規模數據集上,先訓練模型以學習通用的特征表示&am…

vue3 eslint ts 關閉多單詞命名檢查

無效做法 import { globalIgnores } from eslint/config import {defineConfigWithVueTs,vueTsConfigs, } from vue/eslint-config-typescript import pluginVue from eslint-plugin-vue import skipFormatting from vue/eslint-config-prettier/skip-formatting// To allow m…

貪心,回溯,動態規劃

1.貪心算法 ? 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優的選擇,從而希望全局最好或是最優的算法。 特點 局部最優選擇不能保證全局最優高效 適用條件 局部最優可以導致全局最優問題的最優解包含子問題的最優解 經典問題 活動選擇問題最短路徑最…

【Netty4核心原理⑧】【揭開Bootstrap的神秘面紗 - 服務端Bootstrap?】

文章目錄 一、前言二、流程分析1. 創建 EventLoopGroup2. 指定 Channel 類型2.1 Channel 的創建2.2 Channel 的初始化 3. 配置自定義的業務處理器 Handler3.1 ServerBootstrap#childHandler3.2 handler 與 childHandler 的區別 4. 綁定端口服務啟動 三、bossGroup 與 workerGro…

為什么需要自動下載瀏覽器驅動?

為什么需要自動下載瀏覽器驅動? 血淚場景重現 新人入職第一天: 花3小時配置Chrome/Firefox驅動版本不匹配導致SessionNotCreatedException 瀏覽器自動更新后: 所有測試腳本突然崩潰手動查找驅動耗時長 終極解決方案:自動下載驅…

NLP常用工具包

?做一次按NLP項目常見工具的使用拆解 1. tokenizer from torchtext.data.utils import get_tokenizertokenizer get_tokenizer(basic_english) text_sample "Were going on an adventure! The weather is really nice today." tokens tokenizer(text_sample) p…

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug? Pug(原名 Jade)是一種高效的網頁模板引擎,通過縮進式語法和簡潔的寫法減少 HTML 的冗長代碼。Pug 省略了尖括號和閉合標簽,使用縮進定義結構,…

【Android基礎回顧】四:ServiceManager

Android 中的 ServerManager 是 Android 框架中一個用于管理系統服務的核心機制。它是 Binder IPC 的一部分,用于在客戶端和服務端之間建立聯系,廣泛應用于系統服務(如 ActivityManager、WindowManager 等)的注冊與獲取。 1 Serv…

【Android基礎回顧】一:Binder機制是什么?有什么用?

Android中的Binder機制是Android系統中最核心和最基礎的進程間通訊機制。 1 什么是進程間通訊機制(IPC)? 眾所周知,Android系統基于Linux開發,Linux系統里面本來就有進程間通訊機制。 1.1 Linux的IPC(Inter-Process Communication)概覽 它…

Go語言爬蟲系列教程5:HTML解析技術以及第三方庫選擇

Go語言爬蟲系列教程5:HTML解析技術以及第三方庫選擇 在上一章中,我們使用正則表達式提取網頁內容,但這種方法有局限性。對于復雜的HTML結構,我們需要使用專門的HTML解析庫。在這一章中,我們將介紹HTML解析技術以及如何…

AtCoder 第408?場初級競賽 A~E題解

A Timeout 【題目鏈接】 原題鏈接:A - Timeout 【考點】 模擬 【題目大意】 長老會在 s 秒后睡去,進過 n 次叫醒,長老最后能否是保持清醒。 【解析】 模擬每一次拍擊叫醒的過程,查看本次時間距上次時間是否大于 s。注意:第一次拍擊叫醒應和 0 秒相減。 【難度】 …

Unity VR/MR開發-VR設備與適用場景分析

視頻講解鏈接:【XR馬斯維】VR/MR設備與適用場景分析?【UnityVR/MR開發教程--入門】_游戲熱門視頻