C# - 我应该从什么集合大小开始使用字典
C# - From what collection size should I start using Dictionary
我很惊讶我找不到这个问题的答案。
所以我知道 Dictionary 在 O(1) 中渐进地查找,但有散列开销。对于集合大小,是否存在列表优于字典的经验法则?几十件?数百?几千?
根据我的经验,临界点在 10 - 50 项之间,具体取决于散列函数的使用模式和复杂性。但是您应该对您的数据进行基准测试,尤其是当您的自定义哈希函数可能需要一段时间来计算缓存时。
您还可以使用 HybridDictionary
,它在内部是一个用于少量条目的列表,然后是哈希 table。 .Net 框架源代码 shows 9 项的切入点。
public class HybridDictionary: IDictionary {
// These numbers have been carefully tested to be optimal. Please don't change them
// without doing thorough performance testing.
private const int CutoverPoint = 9;
private const int InitialHashtableSize = 13;
private const int FixedSizeCutoverPoint = 6;
更新:正如@Hans Passant 在上面的评论中指出的那样,混合词典没有通用版本,这会影响 boxing/unboxing 的性能和整体使用情况。所以,你应该小心并根据你的情况做基准。我的意思是要表明,大约 10 个项目可以成为开始使用字典与列表的一个点。
我很惊讶我找不到这个问题的答案。 所以我知道 Dictionary 在 O(1) 中渐进地查找,但有散列开销。对于集合大小,是否存在列表优于字典的经验法则?几十件?数百?几千?
根据我的经验,临界点在 10 - 50 项之间,具体取决于散列函数的使用模式和复杂性。但是您应该对您的数据进行基准测试,尤其是当您的自定义哈希函数可能需要一段时间来计算缓存时。
您还可以使用 HybridDictionary
,它在内部是一个用于少量条目的列表,然后是哈希 table。 .Net 框架源代码 shows 9 项的切入点。
public class HybridDictionary: IDictionary {
// These numbers have been carefully tested to be optimal. Please don't change them
// without doing thorough performance testing.
private const int CutoverPoint = 9;
private const int InitialHashtableSize = 13;
private const int FixedSizeCutoverPoint = 6;
更新:正如@Hans Passant 在上面的评论中指出的那样,混合词典没有通用版本,这会影响 boxing/unboxing 的性能和整体使用情况。所以,你应该小心并根据你的情况做基准。我的意思是要表明,大约 10 个项目可以成为开始使用字典与列表的一个点。