我可以立即想象 3 种其他变体
-
查看首先使用
contains_key查看条目是否已经存在,然后使用insert或更新get_mut
-
盲目只是
insert,然后如果第一次插入返回之前的值,则重新insert
- 首先构建一个
HashMap<&str, usize>,然后转换它(完成插入两次的工作)。
问题是,什么更快取决于输入数据。有多少个字符串,它们有多长,输入 Vec 有多长。
我已经benchmarked 5 例:
-
d1: 你输入数据的简短示例
-
few10k:10000 个条目的数组中有 10 个长度为 4 的唯一字符串
-
many10k:10000 个长度≤8 的条目,几乎都是唯一的
-
long: 300 个长度为 300 的唯一字符串
-
mix: 以上都是
这是结果
测试 d1_blind ... bench: 331 ns/iter (+/- 5)
测试 d1_seeing ... bench: 234 ns/iter (+/- 2)
测试 d1_tushushu ... bench: 230 ns/iter (+/- 4)
测试 d1_twice ... 工作台:232 ns/iter (+/- 4)
测试 few10k_blind ... bench: 727,628 ns/iter (+/- 4,557)
测试 few10k_seeing ... bench: 302,445 ns/iter (+/- 3,282)
测试 few10k_tushushu ... bench: 399,378 ns/iter (+/- 3,870)
测试few10k_twice ... bench: 173,828 ns/iter (+/- 2,431)
测试 long_blind ... bench: 70,604 ns/iter (+/- 233)
测试 long_seeing ... bench: 93,349 ns/iter (+/- 381)
测试 long_tushushu ... bench: 69,862 ns/iter (+/- 231)
测试 long_twice ... bench: 92,118 ns/iter (+/- 292)
测试 many10k_blind ... bench: 1,060,656 ns/iter (+/- 65,839)
测试 many10k_seeing ... bench: 1,148,671 ns/iter (+/- 58,452)
测试 many10k_tushushu ... bench: 957,733 ns/iter (+/- 5,392)
测试 many10k_twice ... bench: 1,297,526 ns/iter (+/- 57,415)
测试 mix_blind ... bench: 1,962,634 ns/iter (+/- 7,973)
测试 mix_seeing ... bench: 1,617,921 ns/iter (+/- 45,453)
测试 mix_tushushu ... bench: 1,519,876 ns/iter (+/- 4,872)
测试 mix_twice ... 工作台:1,597,130 ns/iter (+/- 11,068)
在大多数情况下,您的实现似乎表现最好。您可以更进一步并开始混合实现,即运行twice 直到其HashMap<&str, usize> 达到一定大小,然后切换到您的实现。由于这个问题出现在很多地方(例如,也在 sql 数据库中,并且那些人喜欢将事物优化到死),因此可能有人在某处写了一篇关于最佳方法的论文。