【问题标题】:What is the fastest dictionary based class implementation?最快的基于字典的类实现是什么?
【发布时间】:2011-01-22 16:54:14
【问题描述】:

C#<Key, Value>结构实现中哪一种性能更好,速度更快?

P.S.1:我有两个线程,一个写入集合,另一个读取和写入。

P.S.2:关键项目是随机数,然后我的访问是随机的。写入和读取操作是同时进行的。 我正在使用哈希表,但我想知道有没有更好的实现方式,资源使用量更少,性能更好?

【问题讨论】:

  • 您是否尝试在您的场景中使用它们并对其进行分析?
  • 您可以尝试每一个并根据您的要求测量它们 - System.Diagonistics.StopWatch 是您的朋友
  • 插入速度更快?还是回归?还是拆除?一个经常与另一个进行权衡。为什么不告诉我们您的问题是什么?届时我们可以提供更好的信息。
  • 不!我不知道简介。 :( 哪里可以一目了然?
  • 信息不足。数据多久写入一次?是通过特定键检索项目还是需要按排序顺序使用它们?

标签: c# performance dictionary hashtable


【解决方案1】:

为了描述自己,有很多选择。我用过的一款免费分析器是EQATEC,我会推荐它。还有很多可供选择,其中许多都在this SO question 中引用。

至于实现,首先想到的几个是Dictionary<TKey, TValue>SortedDictionary<TKey, TValue>SortedList<TKey, TValue>。当然,我倾向于猜测Dictionary<TKey, TValue> 是最快的,因为它在功能方面是最简单的。但我从未对它们进行过速度测试。

请注意,上述类都是通用类,应该至少在某种意义上使它们比 HashTable 更高效:它们不需要像 System.Object 那样对键和值进行装箱/拆箱,这会导致不必要的内存分配。

另外需要注意的是,由于您处于多线程场景中,因此您需要注意以某种方式锁定您的读/写。 (与HashTable 不同,上述类不能保证对多个读取器和写入器是线程安全的。)在大多数情况下,锁定一个公共对象可能是您最好的选择,而如果您执行的读取操作多于写入操作您可能需要考虑使用ReaderWriterLockReaderWriterLockSlim(两者都允许在多个同时读取器和单个写入器之间切换)。如果您在集合上枚举,那么无论如何您都应该锁定——即使使用HashTable

【讨论】:

  • 我猜 HashSet 或许值得考虑。
  • @Will:你可能在想不同的班级? HashSet<T> 是唯一值的集合;它不提供键值对。
  • 呃!你说得对!我一定对 Dictionary> 感到困惑......对不起! =(
  • @Will:嗯……我喜欢这样。实际上,我觉得Dictionary<string, HashSet<string>> 实际上可能是 actual 字典的合适存储结构(你知道,就像韦伯斯特的,每个单词都有多个定义)。
  • @Dan:很好!事实上,这种结构允许人们搜索一个词,然后得到这个词的结果定义。听起来很棒!我想我会记住这个想法并在适当的时候应用它。我在 Microsoft 的 Bart de Smet 的 LINQ to AD 示例代码中看到了这样的代码。他用它来跟踪财产变化。
猜你喜欢
  • 2010-10-12
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多