在对网络数据包流(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. spinnaker

    https://www.spinnaker.io/guides/tutorials/codelabs/kubernetes-source-to-prod/#configuring-kubernetes

  2. Linux安装centos7

    安装 选择安装centos7,按回车 进入到安装界面: 选择我要自定义分区,然后点击左上角done: 然后自定义分区(swap分区一般为内存的2倍,我这里用的虚拟机截的图,所以内存给的少,具体按照自己 ...

  3. nyoj36-最长公共子序列 (LCS)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 ...

  4. Linux下Thunderbird要安装的插件

    网络时代,总少不了跟邮件打交道,日常生活使用时多数是直接用网页版邮箱,在职场中一般要求用邮件客户端.使用Windows的朋友一般要么用Outlook,要么用Foxmail,其实,我们还有一个很不错的选 ...

  5. 子串字谜substring anagrams

    [抄题]: 给定一个字符串 s 和一个 非空字符串 p ,找到在 s 中所有关于 p 的字谜的起始索引.字符串仅由小写英文字母组成,字符串 s 和 p 的长度不得大于 40,000.输出顺序无关紧要. ...

  6. 22-python爬虫解决gbk乱码问题

    转载自: python爬虫解决gbk乱码问题   今天尝试了下爬虫,爬取一本小说,忘语的凡人修仙仙界篇,当然这样不好,大家要支持正版. 爬取过程中是老套路,先获取网页源代码 # -*- coding: ...

  7. Vue.js基础知识

    <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml&q ...

  8. loadrunner12-参数化以及参数化关联

    1.选中需要进行参数化的字段,单击鼠标右键,选择使用参数替换--新建参数. 2.输入参数名称. 3.根据需要进行选择,我这边选择“Yes”. 4.再次选中刚刚参数化的字段,单击鼠标右键,选择 显示参数 ...

  9. catkin

    catkin  ros https://github.com/dirkholz/pcl_online_viewer rosrun  ???

  10. [SoapUI] 如何让gzip和chunked的response显示出来 [设置Accept-Encoding为deflate]

    如果response的Content-Encoding是gzip或者Transfer-Encoding是chunked,在SoapUI里面是无法显示出来的. 解决办法:在Request的Header里 ...