在对网络数据包流(Flow)进行处理的时候,一开始为了简单使用了vector做为Flow信息的存储容器,当其中的元素达到几十万时,程序的执行速度让人无法忍受。已经对vector进行过合理的预先reserve,因为不是push_back的问题,而是查找。后改为unordered_map,对于同样的数据,执行时间从3分40秒提高到10秒。

unordered_map应该是一个C++11特性,较旧的编译器应该不支持。而VC++2012文档中也提到废弃了hash_map,而使用unordered_map。相关参考见http://www.cplusplus.com/reference/unordered_map/unordered_map

以下是代码。

先编写键结构,这里用的是俗称的“五元组”:

struct flow_key
{
int32 ipa;
int32 ipb;
uint16 porta;
uint16 portb;
uint32 proto; friend bool operator== (const flow_key& a, const flow_key& b);
};

  因为flow_key是自定义的键类型,因此除了上面的operator==,还需要实现hash函数,这里我是随便写的一个,发生冲突的机会应该相当高了,呵呵。据资料说,当hash函数结果相同时,则继续调用operator==进行比较:

struct flow_hash
{
size_t operator() (const flow_key& k) const
{
return k.ipa + k.ipb + k.porta + k.portb;
}
};

  接下来编写value结构,我用的是flow_info,代码较多,就不贴了。

为了之后减小代码敲入字数,我给以上述2者为key和value的unordered_map起了个别名:

typedef std::unordered_map<flow_key,  flow_info,  flow_hash>        flow_map_t;

我这里都用的值类型,没用指针类型,也许能再快些,但指针带来的烦恼也是有代价的,呵呵。

在使用此类型的地方,做如下声明:

flow_map_t  m_flows;

OK了,可以用了。

在使用的过程中,如果要查找,代码大概如下:

        pair<flow_map_t::iterator, bool> hash_ret;
flow_map_t::iterator it = m_flows.find(fkey); if(it == m_flows.end())
{
// 没找到,插入新项
hash_ret = m_flows.insert(make_pair(fkey, flow));
it = hash_ret.first;
}

注意insert操作的返回类型哦,是一个pair,first是插入的对应的迭代器,second是bool值,指示插入是否成功。

我这里主要是还要进行一些额外操作,所以用了什么find之类,如果你不关心这个键是否已在map之中,只想没有就插入,那直接进行insert操作就可以了,如果已经存在此键,则hash_ret的first就是已存在键的元素所对应的迭代器。

由于我需要以整数下标对流信息进行各种操作,所以我在得到完整的unordered_map之后,把它复制给了vector。

使用unordered_map提升查找效率的更多相关文章

  1. DirectX11 With Windows SDK--19 模型加载:obj格式的读取及使用二进制文件提升读取效率

    前言 一个模型通常是由三个部分组成:网格.纹理.材质.在一开始的时候,我们是通过Geometry类来生成简单几何体的网格.但现在我们需要寻找合适的方式去表述一个复杂的网格,而且包含网格的文件类型多种多 ...

  2. 推荐几个Mac插件帮你提升工作效率

    下面这篇文章是小编看到的很好的文章,分享给大家,小编前几天也整理了很多mac专题文章.更多专题,可关注[磨人的小妖精],查看我的文章,也可上[风云社区 SCOEE],查找和下载相关软件资源. (一)综 ...

  3. 何在mysql查找效率慢的SQL语句?

    如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...

  4. Notepad++提升工作效率小技巧

    前言 简单的提升工具效率需求可以借助Notepad编辑器实现.以前也用Python/Shell开发过本文中提到的需求,现在发现其实没有必要.本文介绍一些工作中常见的可以通过"Notepad+ ...

  5. List和Dictionary泛型类查找效率浅析

    List和Dictionary泛型类查找效率存在巨大差异,前段时间亲历了一次.事情的背景是开发一个匹配程序,将书籍(BookID)推荐给网友(UserID),生成今日推荐数据时,有条规则是同一书籍七日 ...

  6. atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较

    atitit.提升开发效率---使用服务器控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比较 如下列举了服务器控件生命周期所要经历的11个阶段. (1)初始化-- --在此 ...

  7. Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结

    Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结 1. 管道抽象 1 2. 层次结构抽象(json,xml etc) 1 3. 异步抽象promise 1 4. Ide ...

  8. atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表

    atitit.提升开发效率---MDA 软件开发方式的革命(3)----自动化建表 1. 建模在后自动建表 1 1. 传统上,需要首先建表,在业务编码.. 1 2. 模型驱动建表---更多简化法是在建 ...

  9. atitit.提升开发效率---mda 软件开发方式的革命--(2)

    atitit.提升开发效率---mda 软件开发方式的革命--(2) 1. 一个完整的MDA规范包含: 1 2. 一个完整的MDA应用程序包含: 1 3. MDA能够带来的最大的三个好处是什么? 2 ...

随机推荐

  1. 克拉 & 24K

    [克拉] 克拉(Ct)是宝石的质量(重量)单位,现定1克拉等于0.2克或200毫克.一克拉又分为100分,如50分即0.5克拉,以用作计算较为细小的宝石.因为宝石的密度基本上相同,因此越重的宝石体积越 ...

  2. HAService 刨坑

    High availability is a characteristic of a system, which describes the duration (length of time) for ...

  3. windows7文件夹怎样默认图片大图显示?

    先打开一个含有图片的文件夹,在文件夹空白处右键选择属性,打开自定义选项卡. 确定自定义选项卡 显示的是:“优化此文件夹:图片”. 然后,选择:组织--文件夹和搜索选项--查看--文件夹视图,应用到文件 ...

  4. Hello_Motion_Tracking 任务一:Project Tango采集运动追踪数据

    我们来看一下中的几个基本的例子 (区域描述.深度感知.运动追踪.视频4个) 参考:Google Tango初学者教程 1. hello_motion_tracking package com.proj ...

  5. Codeforces 766C Mahmoud and a Message 2017-02-21 13:57 62人阅读 评论(0) 收藏

    C. Mahmoud and a Message time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  6. LNMP详细介绍

    1>Nginx概述: 很多人对apache非常熟悉,Nginx与Apache类似,属于WEB容器,同时也是一款高性能的HTTP和反向代理软件,它们之间最大的差别是Apache的处理速       ...

  7. 解决PL/SQL Developer连接数据库时出现 “ORA-12541:TNS:无监听程序”错误

    在用PL/SQL Developer连接数据库时出现“ORA-12541:TNS:无监听程序”错误. 1.检查listener.log日志发现下面错误:TNSLSNR for 32-bit Windo ...

  8. Oracle EBS 快捷键

    打开菜单 Help > Keyboard Help... 功能                         快捷键 =================================== 1 ...

  9. Oracle ERP View - fnd_global.apps_initialize

    在ORACLE APPLICATION FORM中已存储了数据,在客户端TOAD中查找其TABLE找到相关数据行,但当查找其VIEW时就无法找到数据. 原因ORACLE的权责及OU安全机制屏蔽问题. ...

  10. Postgres 主从配置(四)

    Postgres 主从切换 数据库主从结构中由从库升级为主库较为容易些,但是主库恢复后重新加入到主从结构中就不那么容易了.以往的做法是当成一个全新的从库加入进来,数据需要重新从现有的主库中使用pg_b ...