网易首页 > 网易号 > 正文 申请入驻

去重不等于哈希表:一份4050次基准测试的意外答案

0
分享至

凌晨两点,后端工程师李鸣盯着监控面板上一条直线往上升的CPU利用率曲线。他所负责的广告点击去重服务,每小时要处理上亿条事件,用std::unordered_set去重已经顶不住了。同事丢来一句话:“去重最快的方法,根本不一定是哈希集合。”点开一看,是一份名为《The Shape of Duplicate Detection》的研究。里面塞了4050个实测数据、480种负载,很多结论直接挑战了团队过去几年的默认选择——有些场景用哈希表慢了不止一星半点,而是差出94倍甚至9万倍。李鸣从第一页开始,被拉进了一条完全不同的去重设计路径。

研究团队首先瞄准了一个最直白的场景:**稠密有界整数的去重**。当键值是一批范围固定、分布均匀的32位整数时,直接拿哈希集合往里扔,等于强迫数据走一条多余的流程。std::unordered_set每插入一个值就得先算哈希,再在桶链表里探测、找位置,最后还要在内存中跟着指针跳来跳去。可如果替换成一块预分配好大小的位集(bitset),一切变得极其简单:整数值本身就是数组下标,对应比特位置1就代表“见过”,一次内存写入便完成去重判断。在一次100万个均匀32位整数的测试中,位集和哈希集合产出的去重结果完全一致,但前者跑出的速度整整快了94倍。研究者给出的建议没有丝毫摇摆:如果你的键天生就能当数组索引,那就别再把它硬塞进哈希的逻辑里。三十倍到一百一十倍的提升,并不是靠优化哈希函数得来的,而是把问题换了一种数据结构去解决。

接下来画风陡变。当去重对象从整数变成**长文本字符串**时,哈希集合和位集的竞争格局被彻底打乱。长字符串的比较和哈希计算开销极大,光是对一长串字符进行一遍散列,成本就超过了好几次整数操作。这时候,研究给出了一条看似绕路的策略:先为每条字符串计算一个轻量程度的数字指纹,然后对这些指纹排序,排序后马上就能发现重复的指纹;当指纹出现冲突时,再拿出完整的原始字符串做一次严格比对,确保不误判。这套“指纹排序加验证”的流程,在实际测试中跑赢了哈希集合,幅度在1.8倍到2.7倍之间。不过故事并没有一边倒。在某些负载下,重复的字符串会扎堆出现,此时哈希集合反而重新夺回优势——原因在于,多次命中同一个散列桶会让对应的缓存行持续处于热状态,后续访问几乎全从CPU缓存中直接读取,避开了内存延迟。一条简短的结论背后,埋着对现代处理器缓存结构的深刻理解。

另一种更具冲击力的反差,出现在**流式无界数据的去重**上。当你面对每秒涌入数万条的事件流,并且要求不让重复事件流入下游时,问题悄然变了一个方向:能记住的东西始终是有限的。研究对比了两条完全不同的技术路线。第一条,在内存里维护一个滑动窗口,只保留最近一小段时间内的事件键,每来一个事件就在窗口内做一次快速检查——单次操作平均开销约68纳秒,几乎等于几次指针运算的时间。第二条,选择所有事件都落库,采用PostgreSQL,每个进入的事件都立刻开启一个独立事务,写入、提交,然后才对外返回“已去重”的判断。同样的逻辑,同样的正确性保证,但单次检查的成本却暴涨到大约6.1毫秒。从68纳秒到6.1毫秒,同一份去重检查,竟然相差了约9万倍。这9万倍的鸿沟,其实并非由数据库本身慢得离谱造成,而是每一次“即写即提交”的事务化操作,都吞掉了大量磁盘I/O和同步等待。研究紧接着补了一刀:只要稍微改变写入策略,改成攒一批事件后做一次批量提交,就能把数据库方案的延迟拉回到接近内存窗口的数量级。同样用PostgreSQL,差别不过是一个事务边界怎么划的问题。

上述几次实验一起,最终被汇成了一张可供团队直接对准的决策表。每一条都是基于不同键值形态和不同可靠性要求给出的具体选型:

  • 稠密有界整数:毫不犹豫用预分配大小的位集,实测通常快30倍到110倍。</

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
反向卡脖子开始!中国大规模限制技术出口,这4大技术,各个领先

反向卡脖子开始!中国大规模限制技术出口,这4大技术,各个领先

云上乌托邦
2026-06-03 15:16:15
弗兰:乌拉圭人对马竞很有认同感,我们不是热门但能制造麻烦

弗兰:乌拉圭人对马竞很有认同感,我们不是热门但能制造麻烦

懂球帝
2026-06-03 21:25:10
赵露思真把“看着不大,实则敞亮”玩明白了!

赵露思真把“看着不大,实则敞亮”玩明白了!

飛娱日记
2026-04-26 08:49:04
A股,登上新闻联播

A股,登上新闻联播

中国基金报
2026-06-03 22:09:50
47岁薛佳凝参加泼水节,没生娃也有大肚腩,生图看着比精修胖20斤

47岁薛佳凝参加泼水节,没生娃也有大肚腩,生图看着比精修胖20斤

蒂蒂茱家
2026-04-15 12:41:39
你以为麻豆传媒是卖片的,其实它是卖人的

你以为麻豆传媒是卖片的,其实它是卖人的

创始人笔记
2026-04-23 21:44:50
价值60万宝马X5托运途中被烧毁,物流公司称“最多赔2400元”,法院:物流公司存在重大过失,判决全额赔偿

价值60万宝马X5托运途中被烧毁,物流公司称“最多赔2400元”,法院:物流公司存在重大过失,判决全额赔偿

河南交通广播1041
2026-06-02 12:20:37
婚内强奸是强奸,那妻子抢工资是抢劫?付费同房是嫖娼?撕开婚姻最双标的底层真相

婚内强奸是强奸,那妻子抢工资是抢劫?付费同房是嫖娼?撕开婚姻最双标的底层真相

青苹果sht
2026-05-26 04:58:29
胡歌拿下白玉兰视帝,于和伟陪跑真可惜

胡歌拿下白玉兰视帝,于和伟陪跑真可惜

情感大头说说
2026-06-03 19:18:27
76岁的万科创始人王石,最近彻底成了全网焦点。

76岁的万科创始人王石,最近彻底成了全网焦点。

梦录的西方史话
2026-04-23 14:36:39
法网爆冷!萨巴伦卡崩盘出局,女单四强全部诞生

法网爆冷!萨巴伦卡崩盘出局,女单四强全部诞生

老牛体育解说
2026-06-03 22:13:35
1928年,杨宇霆被枪决前跟张学良合影,注意看站姿,早已貌合神离

1928年,杨宇霆被枪决前跟张学良合影,注意看站姿,早已貌合神离

舆图看世界
2026-06-02 08:10:03
超标收取小区车位费,镇江一物业公司被处罚

超标收取小区车位费,镇江一物业公司被处罚

新浪财经
2026-06-03 16:41:03
《主角》结局:刘亿没死,刘红兵没出车祸,易青娥选宋雨继承衣钵

《主角》结局:刘亿没死,刘红兵没出车祸,易青娥选宋雨继承衣钵

嘴角上翘的弧度
2026-06-02 03:20:33
40岁以上中年人失业都干嘛去了?网友:跑顺风车,送外卖,当保安

40岁以上中年人失业都干嘛去了?网友:跑顺风车,送外卖,当保安

律法刑道
2026-04-12 09:35:52
异性对接吻一定要慎重,一旦“接吻”了,关系就会发生重大变化!

异性对接吻一定要慎重,一旦“接吻”了,关系就会发生重大变化!

皓皓情感说
2026-05-15 12:29:38
新能源汽车维修遭垄断,4400万车主选择权被锁

新能源汽车维修遭垄断,4400万车主选择权被锁

第一财经资讯
2026-05-11 16:52:11
FIFA秘书长:与央视达成了FIFA与中国有史以来金额最高的协议

FIFA秘书长:与央视达成了FIFA与中国有史以来金额最高的协议

懂球帝
2026-06-03 13:40:07
1980年,陈丕显说王兆国38岁就当二汽副厂长,邓小平:要好好培养

1980年,陈丕显说王兆国38岁就当二汽副厂长,邓小平:要好好培养

帝哥说史
2026-05-28 06:40:03
发现一个现象:中产返贫三件套,已经升级为六件套了!

发现一个现象:中产返贫三件套,已经升级为六件套了!

番外行
2026-05-18 10:25:35
2026-06-04 02:31:00
硬核玩家2哈
硬核玩家2哈
沉淀中,勿扰
4512文章数 24关注度
往期回顾 全部

科技要闻

传DeepSeek融资意向500亿:腾讯投100亿

头条要闻

男子不想上班辞职后上武当山当道士 8个月后选择下山

头条要闻

男子不想上班辞职后上武当山当道士 8个月后选择下山

体育要闻

选择中国品牌的库里,和他们的巨大野心

娱乐要闻

官方痛批乱象 刘涛郑恺等艺人遭点名

财经要闻

AI,开始偷懒了?

汽车要闻

专访蒋平:安全不做高低配 长安要让安全技术普惠

态度原创

房产
旅游
本地
时尚
公开课

房产要闻

突发!254亩调规,海口江东的超级学校真的快来了!

旅游要闻

“一票跨两省”还游客完整壶口 | 新京报社论

本地新闻

用杨柳青年画的方式,打开天津

月经、初潮与生育真相,那些藏在动画片里的性启蒙

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版