C# 我什么时候应该使用分类词典而不是词典

C# 我什么时候应该使用分类词典而不是词典,c#,dictionary,benchmarking,sorteddictionary,C#,Dictionary,Benchmarking,Sorteddictionary,正如我在前几篇文章中所写的那样,我对c#世界还是相当陌生的,所以我编写了一个小的基准测试来比较字典、哈希表、SortedList和SortedDictionary。该测试运行8000次迭代,包含50到100000个元素。我测试了添加新元素、搜索元素以及在一些元素中循环,这些都是随机的。结果和我预期的一样,只是分类词典的结果让我很困惑。。。所有结果都很慢。所以我遗漏了一些关于分类词典的概念。我已经问过谷歌了,但我发现其他人都得到了同样的测试结果。根据测试的执行情况略有不同。我又问了一个问题:为什么

正如我在前几篇文章中所写的那样,我对c#世界还是相当陌生的,所以我编写了一个小的基准测试来比较字典、哈希表、SortedList和SortedDictionary。该测试运行8000次迭代,包含50到100000个元素。我测试了添加新元素、搜索元素以及在一些元素中循环,这些都是随机的。结果和我预期的一样,只是分类词典的结果让我很困惑。。。所有结果都很慢。所以我遗漏了一些关于分类词典的概念。我已经问过谷歌了,但我发现其他人都得到了同样的测试结果。根据测试的执行情况略有不同。我又问了一个问题:为什么SortedDictionary比其他所有的都慢得多?

SortedDictionary被实现为一个二进制搜索树。因此,访问元素是O(lg(n))。字典是一个哈希表,访问的复杂度为O(1)


当需要对数据进行排序时(字典没有定义顺序),SortedDictionary非常有用。字典适用于大多数情况。

答案很简单,如果您需要排序的字典,您可以使用
SortedDictionary

记住,即使它在你的测试中是最慢的,它仍然不慢。如果您确实需要
SortedDictionary
的功能,那么它是最好的解决方案。使用
字典
分类列表
进行同样的操作会慢得多

我又问了一个问题:为什么分拣的速度比其他的慢得多

Etienne之前已经给出了技术上的答案,但要补充一句更“简单”的话:我猜SortedDictionary的“排序”位部分会像Etienne的答案那样给插入甚至检索条目带来一些开销

然而,在一个真实的应用程序中,如果你在应用程序中需要一个“已经排序的字典”,SortedDictionary可能会提供相当大的性能或“感知性能”的提高


希望这能有所帮助。

我认为使用sorteddictionary“检索条目”要快得多-在大多数情况下“在大多数情况下”=取决于词典的大小。3项分类词典的阅读速度可能比3项词典快,而15项分类词典的阅读速度则会慢。直接回答这个问题,“为什么分类词典比其他词典慢得多”:这是CPU使用率和RAM使用率之间的折衷。Dictionary比SortedDictionary更快,因为它是作为哈希表实现的,哈希表是一种旨在使用多余内存以尽可能少地使用操作的算法。SortedDictionary是一种二叉搜索树,该算法旨在使用尽可能多的操作以使用尽可能少的RAM。INB4:是的,这些都是对哈希表和BST背后动机的过于简化的表示。性能不仅仅是大运算。O(1)操作可能长于25次树搜索操作。我不认为是这样,但是这个答案并没有告诉你应该在什么情况下使用它们。当你不需要按照键对数据进行排序时,字典仍然适用于大多数用例。当然,您应该始终配置文件,但是初始实现可能应该坚持使用字典,除非需要排序,或者配置文件显示使用SortedDictionary更有效。这个答案基本上回答了以下问题:“我什么时候需要SortedDictionary?”说:“当您需要一个时!”这一点都没有帮助。使用
SortedDictionary
时,请至少举一个例子。@JackMiller:为什么你认为需要一个具体的例子?公认的答案没有给出任何示例。公认的答案解决了性能问题(无需示例)。这个答案涉及标题中的问题:“我什么时候应该使用分类词典而不是词典[?]”来回答这样一个问题,可以定义(普遍适用的)规则(这将非常困难),或者给出一些具体的例子。