当前位置: 首页 > news >正文

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.lqws.cn/news/163081.html

相关文章:

  • 【git】把本地更改提交远程新分支feature_g
  • [蓝桥杯]耐摔指数
  • word公式_latex
  • 【西门子杯工业嵌入式-2-点亮一颗LED】
  • 2024年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 基于红黑树的插入功能,对Set和Map部分功能进行封装实现
  • Python训练第四十五天
  • 【C#】异步和多线程
  • 力扣HOT100之二分查找: 34. 在排序数组中查找元素的第一个和最后一个位置
  • 【高等数学】函数项级数
  • C获取unix操作系统的信息
  • python版若依框架开发:前端开发规范
  • spring4第7-8课-AOP的5种通知类型+切点定义详解+执行顺序
  • 3D Web轻量化引擎HOOPS Communicator三大可视化应用场景,解析浏览器支持功能!
  • 指针的使用——基本数据类型、数组、结构体
  • opencv-python的使用——from official tutorial(持续更新)
  • Git Svn
  • 今日学习:工程问题(场景题)
  • 数据库三范式设计---小白初学+案例引入
  • 一键切换不同状态,3D数字孪生场景搭建更便捷!
  • Amazing晶焱科技:电子系统产品在多次静电放电测试后的退化案例
  • React 第五十四节 Router中useRevalidator的使用详解及案例分析
  • [大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
  • MySQL——视图 用户管理 语言访问
  • 应用app的服务器如何增加高并发
  • Linux 里 su 和 sudo 命令这两个有什么不一样?
  • 【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】
  • 每日算法刷题Day23 6.5:leetcode二分答案3道题,用时1h40min(有点慢)
  • CICD实战(一) -----Jenkins的下载与安装
  • HarmonyOS:如何在启动框架中初始化HMRouter