使用多个词典或单个词典

1 c# performance dictionary

我对C#中的字典有一般性的疑问.假设我在一个文本文件中读取,将其拆分为键和值并将它们存储在字典中.将它们全部放入单个字典或将其拆分为更小的字典会更有用吗?它可能不会对小文本文件产生巨大影响,但其中一些文件有超过100.000行.你会推荐什么?

Eri*_*ric 6

在尝试优化之前,第一条规则始终是基准.话虽这么说,有些人可能会为你做基准测试.在这里检查这些结果

从文章(以防它从网上消失)

较小的字典(键数的一半)要快得多.在这种情况下,两个字典对输入的行为是相同的.这意味着在Dictionary中使用不需要的键会使其变慢.

我的观点是你应该为不同的目的使用单独的词典.如果您有两组键,请不要将它们存储在同一个词典中.如果可以将它们分开,则可以增强查找性能.

图片来源:dotnetperls.com

同样来自文章:

全字典:791毫秒
半角字典:591毫秒[更快]

也许你可以使用更少的代码和更多的200ms,这实际上取决于你的应用程序


l33*_*33t 5

我认为原始文章要么不准确,要么已经过时。无论如何,有关“词典大小”的声明已被删除。现在,回答这个问题:

定位为单个字典.NET 6 x64提供了更好的性能。事实上,使用的字典越多,性能就越差:

|        Method |      Mean |    Error |    StdDev |    Median |
|-------------- |----------:|---------:|----------:|----------:|
|  Dictionary_1 |  91.54 us | 1.815 us |  3.318 us |  89.88 us |
|  Dictionary_2 | 122.55 us | 1.067 us |  0.998 us | 122.19 us |
| Dictionary_10 | 390.77 us | 7.757 us | 18.882 us | 382.55 us |
Run Code Online (Sandbox Code Playgroud)

结果应该不足为奇。对于 N 字典查找,您将为每个要查找的项目计算哈希码最多 N 次,而不是只计算一次。此外,您还必须循环遍历字典列表,这会对性能产生微小的影响。总而言之,这是有道理的。

现在,在一些奇怪的情况下,使用 N 字典可能会获得一些速度。例如,考虑一个微小的 CPU 缓存、抖动、哈希码冲突等。不过,还没有遇到这样的场景......

基准代码

|        Method |      Mean |    Error |    StdDev |    Median |
|-------------- |----------:|---------:|----------:|----------:|
|  Dictionary_1 |  91.54 us | 1.815 us |  3.318 us |  89.88 us |
|  Dictionary_2 | 122.55 us | 1.067 us |  0.998 us | 122.19 us |
| Dictionary_10 | 390.77 us | 7.757 us | 18.882 us | 382.55 us |
Run Code Online (Sandbox Code Playgroud)