在对网络数据包流(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. Go and Beego Development

    1. Beego wiki in en and cn https://beego.me/ For API development: https://beego.me/blog/beego_api 2. ...

  2. cas 退出后跳转指定页面

    退出连接 https://localhost:8888/cas/logout?service=https://localhost:8080/cas-client/login 修改cas-server配 ...

  3. 快速变幻AABB的顶点

    [快速变幻AABB的顶点] 当要变幻一个AABB时,可以快速计算变幻后顶点的AABB.当有旋转时,根据8个顶点变幻后的AABB可能会更大. AABB的八个顶点需分别作如下变幻: 注意到为了使 x' 最 ...

  4. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  5. php之trait 个人笔记

    自从 php 5.4 起 实现了一种代码复用的方式(tarit) 类似 class  但是用tarit 写的类 不能被实例化 和继承.现在来看看他的用法 <?php trait A{ publi ...

  6. [.NET] WeakReference的使用

    声明:本篇博客翻译自:http://tipsandtricks.runicsoft.com/CSharp/WeakReferences.html 由于水平(技术水平+英语理解能力)有限/不足,肯定会有 ...

  7. c语言技术课第一次作业

    读邹欣老师博客关于师生关系有感 1)大学和高中最大的不同是没有人天天看着你,请看大学理想的师生关系是?有何感想? 答:    在邹欣老师博客中我看到邹欣老师列举了很多师生关系的类型,把这种关系比喻成很 ...

  8. PHP 微信公众号开发 - 消息推送

    项目微信公众号开发,需要做用户消息推送,记录下来以便日后使用 1,接上一篇文章,可以查看如何获取用户openid PHP 微信公众号开发 - 获取用户信息 2,添加模板消息 3,查看模板详情 根据模板 ...

  9. IntelliJ IDEA 2016.1.3(64) license server 与汉化

    license server:http://idea.iteblog.com/key.php 汉化:将resources_cn.jar 复制到安装IDEA安装目录下的lib文件夹中.重新打开即可. r ...

  10. struts2获取request、session、application的四种方式

    struts2获取request.session.application的四种方式 //获取map类型的request.session.application public class LoginAc ...