关于c#:密钥的长度是否会影响Dictionary的性能?

Does the length of key affect Dictionary performance?

我将在.NET项目中使用字典来存储大量对象。因此,我决定使用GUID字符串作为键,以确保每个对象的唯一键。

大键(例如GUID(或更大的键))是否会降低字典的性能,例如通过其键检索对象?

谢谢,
安德烈(Andrej)


我建议使用实际的Guid而不是Guid的字符串表示形式。是的,在比较字符串时,长度确实会影响所需的操作次数,因为它必须逐个字符地比较字符串(最低限度;不包括任何特殊选项,例如IgnoreCase)。实际的Guid将只给您提供16个字节进行比较,而不是string中的最小值32个。

话虽这么说,您很可能不会注意到任何区别...过早的优化以及所有这些。我只是选择Guid键,因为这就是数据。


与获取值有关的对象的实际大小无关紧要。查找值的速度更多地取决于传入的IEqualityComparer<T>实例

中的两种方法的速度

  • GetHashcode()
  • 等于()

编辑

许多人以String为由说更大的对象大小会降低查找性能。出于某些原因,必须与一粒salt一起服用。

  • 对于默认比较器,上述方法的性能随着字符串大小的增加而降低。仅仅因为System.String是正确的,并不意味着它通常是正确的
  • 您可以以与字符串长度无关的方式轻松地编写不同的IEqualityComparer<String>


是,不是。较大的字符串会增加字典的内存大小。而更大的大小意味着略微更长的时间来计算哈希大小。

但是担心这些事情可能是过早的优化。尽管速度会变慢,但您可能不会真正注意到它。


请参阅性能-使用Guid对象或Guid字符串作为键来解决类似问题。您可以使用替代密钥进行测试。


我在Google上进行了快速搜索,找到了这篇文章。

http://dotnetperls.com/dictionary-string-key

它确认通常较短的键比较长的键的性能更好。


显然是的。这是一个很好的测试:字典字符串键测试