最近在为推荐服务作性能调优,这个服务的主要逻辑是用离线计算的模型数据给请求中的每个广告打分,再返回这些广告的排序结果,这里面打分的过程其实就用请求中的数据拼成各种key,去查一个大的 map,这种计算非常多,成为了主要的性能瓶颈,代码比较老,使用的是 boost::unordered_map,为了解决这个问题,找了一些第三方库和标准库对比了一下

下面是在一台 aws r4.xlarge 机器上的测试结果(注意编译的时候一定要加 -O2):

std::map<int, int>                                 => 51866903
std::unordered_map<int, int>                       => 3838175
std::unordered_map<int, int, nohashint>            => 3508570
std::unordered_map<int, int>(N)                    => 3804471
boost::unordered_map<int, int>                     => 3291384
boost::unordered_map<int, int, nohashint>          => 3293934
boost::unordered_map<int, int>(N)                  => 3265856
google::dense_hash_map<int, int>                   => 785969
google::dense_hash_map<int, int, nohashint>        => 784455
google::dense_hash_map<int, int>(N)                => 899262
tsl::hopscotch_map<int, int>                       => 654668
tsl::hopscotch_map<int, int, nohashint>            => 680964
tsl::hopscotch_map<int, int>(N)                    => 663607
tsl::robin_map<int, int>                           => 406176
tsl::robin_map<int, int, nohashint>                => 411358
tsl::robin_map<int, int>(N)                        => 409993

可以看到 tsl::robin_map 的性能基本上能达到 std::unordered_map 的 10 倍,这个性能和操作系统以及库版本也有一定关系,实际生产环境中建议把代码拉下来在自己的环境下测试一下

我们线上用 tsl::robin_map 替换了原来的 boost::unordered_map,整体性能提升了 5 倍,这里面当然也还包含了一些其他的优化,这个优化算是比较大的优化点了

参考链接

  • Benchmark of major hash maps implementations:
    https://tessil.github.io/2016/08/29/benchmark-hopscotch-map.html
  • 测试代码: https://github.com/hatlonely/hellocpp/blob/master/src/unordered_map/test_unordered_map.cpp

转载请注明出处
本文链接:http://www.hatlonely.com/2018/08/01/c-map-%E6%9F%A5%E6%89%BE%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/

c++ map 查找性能测试相关推荐

  1. C++ std map unordered_map hash_map 的查找性能测试代码及结果

    C++ std map unordered_map hash_map 的查找性能测试代码.过程及结果 测试环境 测试结果 测试代码 测试过程记录 测试版本 RLEASE x64 测试版本 Debug ...

  2. JAVA SE学习day_13 :Map 查找表

    一.java.util.Map 查找表 Map体现的样子是一个多行两列的表格,其中左列称为key,右列称为value,Map总是根据key获取对应的value.因此我们可以将查询的条件作为key,对应 ...

  3. java map 查找_Map 查找表操作

    packageseday13;importjava.util.HashMap;importjava.util.Map;/***@authorxingsir * java.util.Map 查找表,Ma ...

  4. 集合框架Collection、Map查找表(Java SE第三阶段9)

    目录 Collection List和Set 集合方法 集合持有对象的引用 集合间操作方法 Iterator迭代器 增强型for循环 泛型机制 List List(ArrayList和LinkedLi ...

  5. map unordered_map hash_map的查找性能测试

    结论如下: Release模式下: 1. 容量为10的时候,查找效率:map > unordered_map > hash_map 2. 容量为100的时候,查找效率:map = unor ...

  6. map iterator_一个简单的Map Iterator性能测试

    map iterator Java Map性能有很多方面可以衡量,但是关键的一个是简单的单线程扫描. 这是一些针对Iterators和Java 8 Map.forEach()简单测试代码,以及一些图形 ...

  7. 一个简单的Map Iterator性能测试

    Java Map性能有很多方面可以衡量,但是关键的一个是简单的单线程扫描. 这是一些针对Iterators和Java 8 Map.forEach()简单测试代码,以及一些图形结果. 1.性能测试困难 ...

  8. java map 查找_在Java TreeMap中查找元素位置

    我正在使用StrMap TreeMap< String,String>的TreeMap,并使用它来实现词典. 然后我有一个文件的集合,并且想要在字典定义的向量空间(单词的空格)中创建每个文 ...

  9. PTA 7-45 航空公司VIP客户查询(25 分)map查找应用

    7-45 航空公司VIP客户查询(25 分) 不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记 ...

最新文章

  1. 2013-10-31 《October 31st, 2013》
  2. Python实现 灰色关联分析 与结果可视化
  3. Boost:bind绑定访客的测试程序
  4. c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示
  5. Alex Hanna博士:Google道德AI小组研究员
  6. 前端学习(3002):vue+element今日头条管理--创建组件和设置路由
  7. fedora16设置root登录
  8. makefile 无法工作_什么是Makefile,它如何工作?
  9. timeout 和 deadline
  10. Android Broadcast 和 BroadcastReceiver的权限限制
  11. java 对excel指定单元格的数据修改后并输出到指定文件夹
  12. 获取两个数组的差 php,php-获取2个数组之间的差
  13. 拼多多上市关你什么事?
  14. android 多媒体相册,朵朵多媒体相册免费版
  15. VS2012 产品密钥
  16. win7录屏_原来电脑自带的录屏功能,那么好用,可惜很多人还不知道,真遗憾...
  17. 智能陈桥五笔输入法 for linux,在Linux下安装陈桥五笔输入法
  18. eclipse jsEclipse javascript编辑器
  19. 照片放大模糊怎么变清晰,图片无损放大
  20. [BZOJ3772]精神污染(dfs序+主席树)

热门文章

  1. .NET MVC5专题(前后端交互传参方式)
  2. 在Java中轻松将HTML格式文本转换为纯文本(保留换行)
  3. 俞军老师解答职场话题
  4. GB/T 7714-2015 Enenote参考文献模板免费下载
  5. 蝉知CMS的GetShell
  6. IPTV解决方案和IPTV资料
  7. 在计算机潮流计算的三类节点中,电力系统分析习题集.doc
  8. 拜日式精准引导词_拜日式引导词
  9. PHP接口上传文件图片详解
  10. 单片机重启或拔电依旧不能下载程序