概述

简单对比map和unordered_map的性能。
map内部是红黑树,在插入元素时会自动排序,而无序容器unordered_map内部是散列表,通过哈希而不是排序来快速操作元素,使得效率更高。当你不需要排序时选择unordered_map的效率更高。

测试范例

测试代码

#include <iostream>
#include <string>
#include <sys/time.h>
#include <map>
#include <unordered_map>
using namespace std;const int kRunTime1 = 1000*1000;     // 循环次数
const int kRunTime2 = 1000*10000;
int main()
{std::map<int, int> mp;std::unordered_map<int, int> unordermp;timeval st, et;cout << "插入个数 = " << kRunTime1 << endl;gettimeofday(&st, NULL);for(int i = 0; i < kRunTime1; ++i){mp.insert(make_pair(i, i));}gettimeofday(&et, NULL);cout << "1 有序map测试时间insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;gettimeofday(&st, NULL);for(int i = 0; i < kRunTime1; ++i){unordermp.insert(make_pair(i, i));}gettimeofday(&et, NULL);cout << "1 无序map测试时间insert time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;cout << "\n插入个数 = " << kRunTime2 << endl;mp.clear();gettimeofday(&st, NULL);for(int i = 0; i < kRunTime2; ++i){mp.insert(make_pair(i, i));}gettimeofday(&et, NULL);cout << "2 有序map测试时间insert  time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;mp.clear();gettimeofday(&st, NULL);for(int i = 0; i < kRunTime2; ++i){mp.emplace(make_pair(i, i));}gettimeofday(&et, NULL);cout << "2 有序map测试时间emplace time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;unordermp.clear();gettimeofday(&st, NULL);for(int i = 0; i < kRunTime2; ++i){unordermp.insert(make_pair(i, i));}gettimeofday(&et, NULL);cout << "2 无序map测试时间insert  time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;unordermp.clear();gettimeofday(&st, NULL);for(int i = 0; i < kRunTime2; ++i){unordermp.emplace(make_pair(i, i));}gettimeofday(&et, NULL);cout << "2 无序map测试时间emplace time:" << (et.tv_sec-st.tv_sec)*1000 + (et.tv_usec-st.tv_usec)/1000 << "ms" << endl;return 0;
}

测试结果

第一次运行

插入个数 = 1000000
1 有序map测试时间insert time:922ms
1 无序map测试时间insert time:360ms插入个数 = 10000000
2 有序map测试时间insert  time:10451ms
2 有序map测试时间emplace time:10531ms
2 无序map测试时间insert  time:3854ms
2 无序map测试时间emplace time:2956ms

第二次运行

插入个数 = 1000000
1 有序map测试时间insert time:918ms
1 无序map测试时间insert time:344ms插入个数 = 10000000
2 有序map测试时间insert  time:10470ms
2 有序map测试时间emplace time:10597ms
2 无序map测试时间insert  time:3826ms
2 无序map测试时间emplace time:2932ms

第三次运行

插入个数 = 1000000
1 有序map测试时间insert time:909ms
1 无序map测试时间insert time:376ms插入个数 = 10000000
2 有序map测试时间insert  time:10395ms
2 有序map测试时间emplace time:10505ms
2 无序map测试时间insert  time:4015ms
2 无序map测试时间emplace time:3102ms

测试结果

  • unordered_map的插入速度明显优于map
  • 对于map,emplace的接口相对于insert 没有提升,甚至效率还差一点
  • 对于unordered_map,emplace的接口相对于insert 有30%左右的提升

C++有序map和无序unordered_map性能测试对比相关推荐

  1. STL map与Boost unordered_map - 有何不可的日志 - 网易博客

    STL map与Boost unordered_map - 有何不可的日志 - 网易博客 STL map与Boost unordered_map 2012-03-30 16:06:26|  分类: c ...

  2. draft.js_如何使用快捷方式在Draft.js中创建有序列表和无序列表

    draft.js by Andrey Semin 通过安德烈·塞米(Andrey Semin) 如何使用快捷方式在Draft.js中创建有序列表和无序列表 (How to create ordered ...

  3. golang map的无序性验证

    map的无序性 大量数据如果没有写入,只是读取不会出错 var wg sync.WaitGroupm := make(map[int]int)for i := 0; i < 10000; i++ ...

  4. Go语言中的Map和List实现有序Map

    Go语言中的Map和List实现有序Map Map定义: Go 中 Map是一种无序的键值对的集合.Map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值.Map是一种集合,所以 ...

  5. Java实现有序数组和无序数组_【算法】字典的诞生:有序数组 PK 无序链表

    参考资料 <算法(java)>                           - - Robert Sedgewick, Kevin Wayne <数据结构>       ...

  6. FreeSql与SqlSugar性能测试对比

    这篇文章主要是对SqlSugar 做一次简单的性能测试对比.主要针对插入.批量插入.批量更新.读取性能的测试: 测试环境 1..net core 2.2 2.FreeSql 0.3.17 3.sqlS ...

  7. Firefox 和 Chrome 性能测试对比

    Google 于上周推出了 Chrome 75 的首个稳定版,更新说明里面虽然一如既往地写到"包含性能改进",但对包括笔者在内的大部分用户而言,这些所谓的改进其实很难感知. 所以才 ...

  8. 有序列表和无序列表的不同类型

    大家可曾想过有序列表和无序列表除了默认类型,是否还有其它的类型呢? 虽然不常用,但也做了一篇总结给大家做参考. 无序列表 UL (unorder list的缩写) 定义:无序列表是一个项目的列表,此列 ...

  9. python有序列表无序列表区别_用Python链表实现有序表与无序表

    用Python链表实现有序表与无序表 <数据结构与算法>MOOC(北大地空)课堂笔记 2020.4 by dlnb526 啥是链表 链表,顾名思义,顾名思义,链表像锁链一样,由一节节节点连 ...

  10. html有序无序标签,HTML标签有序标签和无序标签

    1. 标签定义无序列表,所谓无序,是指以●.○.▽.▲等开头的,没有顺序的列表项目 1.1  设置无序列表的类型-type 无序列表的默认符号是圆点(● ). 元素有type属性,通过定义不同的typ ...

最新文章

  1. 关闭生成调试信息和嵌入清单
  2. DSX2-5000 CH测试结果使用福禄克LinkWare Live软件的好处
  3. 论文浅尝 - WWW2020 | 从自然语言交互中提取开放意图
  4. a标签无跳转的死链接
  5. mysql function 参数默认值_MySQL参数log_bin_trust_function_creators介绍
  6. windows10怎么锁定计算机,别让Windows 10锁住亲友
  7. Python爬虫之(九)数据提取-XPath
  8. 如何设计自动化测试的代码结构
  9. java例程练习(东软笔试题——n阶平面魔方)
  10. 庖丁解牛之-Android平台RTSP|RTMP播放器设计
  11. C语言序列求和epa,Altera Innovateasia
  12. 华为透露成长秘诀:信息化建设铸就发展奇迹
  13. 万年历的实现——C++Java版
  14. 打印机出现另存为xps_win10系统打印文件弹出另存为xps/pdf的处理方法
  15. 数学分析中的点荟萃(持续补充修缮)
  16. 手游入门必备基础知识
  17. Wireless Communications - 2.4 Ray Tracing
  18. A05-没有奥维vip,导入元素个数受限制,想导入三区三线图斑怎么办?
  19. 魔性的数字人形时钟动态pc端电脑屏幕保护
  20. sizeof(long)

热门文章

  1. 迈迪 由于目标计算机积极拒绝,adb“由于目标计算机积极拒绝,无法连接”的解决方案...
  2. 使用Rider和Emmylua进行UnLua配置
  3. 618号外:MS08067安全实验室也做安全培训了
  4. UE4 C++无法打开包括文件 C1083
  5. PHP 类似time控件功能,最新火车头免费伪原创插件,多功能秒杀市面上所有同类工具...
  6. java导出文件excle报错Failed to read zip entry source
  7. 深入浅出net泛型编程[转载] - 天轰穿.net/vs2005/ajax入门 - 博客园
  8. vue中播放消息提示音
  9. nxdn标准简介_标准活动介绍
  10. 曲面映射的算法理论基础