为了数一次单词,我哈希了它两遍
来源:dev.to — 2026-08-04
📋 概述
作者在剖析一个日志解析器时发现,最平淡的“字典自增”热循环竟然比预期更占性能,原因近乎滑稽:那段几乎人人都会写的计数代码把每个 key 哈希了两次。TryGetValue 先算哈希、走桶、找到条目,然后 counts[code] = ... 又把这一切扔掉重来一遍去写入——同一个 key、同一个哈希、同一趟桶查找,每个 token 做了两遍。他改用 CollectionsMarshal.GetValueRefOrAddDefault,一次哈希一次走桶,直接拿到指向存储槽的 ref 原地修改。在 500 万个 token、2 万词表的测试上,循环提速约 1.7 倍,且每次运行都稳定成立。
🔑 核心要点
- 教科书式计数代码 `TryGetValue` 加下标写入,会把同一个 key 哈希两遍
- GetValueRefOrAddDefault 只找一次槽并返回指向存储的 ref,一次哈希一次走桶
- 500 万 token 实测循环约 1.7 倍加速,且每次运行都稳定
- 命中与未命中路径都能省掉第二次查找——这方法同时覆盖存在与新增两种场景
💡 金句
One hash, one bucket walk, then you mutate the storage in place.
👍 0
👎 0
← 返回 Dev.to 首页