最近有一个server在重启的时候总要花费5分钟左右来加载配置文件,导致外网服务不可用,今天和几个同事一起研究了一下,总算找到了问题所在.
抽象出代码如下:

对imap1和StTestMap1两个map分别插入40000次,运行结果如下:

StTestMap1的插入居然消耗了27秒,太奇怪了!难道真的hash_map的实现有问题?我们来换成map试一下.
先重载一下StTest的小于符号:

两个map的定义改为:

运行结果如下:

用map就没问题,所以怀疑到了哈希函数的身上,我们发现StTest的哈希函数居然是如下定义:

bool型,一直返回1!也就是说所有的节点都放到了一个桶里!
找到了原因,我们来改一下代码:

运行结果如下:

结果正常了,可能由于之前的同事错把

当成哈希函数,所以才会出现如下问题。使用哈希map的时候,哈希函数的离散情况是很关键的,希望这篇文章能帮助大家避免犯类似的错误。
另外用红黑树map其实大部分情况够用了,不必过分追求效率。
另:
代码下载

关于使用STL的红黑树map还是hashmap的问题

最近在修改一个代理机server,增加url rewrite的功能,由于其单机的访问量很高,20000/s左右,对性能要求很高,所以在做url映射的时候,纠结在用map还是hash...

阅读全文

11则回应给“关于哈希map奇慢无比的原因定位”

  1. 站长工具说道:

    昨天在功能升级过程中发现搜狗的网站评级系统升级了,由原来100分制变成10分制,而且增加了专用查询服务器,查询链接格式为http://rank.ie.sogou.com/sogourank.php?ur=http://www.wsprite.com/,特来提醒朋友,快试试自己的博客和朋友的博客是属于哪个级别。

    [回复]

  2. 葡萄酒说道:

    来踩踩 春节快乐

    [回复]

  3. 青岛西点说道:

    不太懂==~~~~(>_<)~~~~

    [回复]

  4. 雨碎江南说道:

    妈呀…
    从来没有见过这么牛逼的散列函数.

    [回复]

    Dante 回复:

    同感……,复杂的问题背后总是一个简单的原因……

    [回复]

  5. 站长工具说道:

    博主,兔年快乐!

    [回复]

    Dante 回复:

    哈哈,兔年快乐!

    [回复]

  6. 博主解决了一个大问题阿~

    [回复]

  7. 小小vimer说道:

    博主你简直是我心目中的神

    [回复]

    Dante 回复:

    这个,吓到我了。。。

    [回复]

  8. 博主解决了一个大问题阿~

    [回复]

发表评论