2017-02-27 115 views
-2

也许这个问题已经以许多不同的方式回答了很多次。不过,我正在寻找更具体的东西。通用字典,我认为比哈希表更快,因为他们不需要经历装箱/拆箱的过程。Hashtable vs Dictionary:更快?

然而,不哈希表进行排序,这意味着搜索可能会更快?由于密钥被散列和存储,搜索时是否会涉及装箱/拆箱?

+0

它只会是拳击/如果你是在'Hashtable'使用值类型(结构)拆箱。否则,它只是在检索条目时想要获取特定类型时进行投射。你也应该使用'HashSet',这是一个通用的查找而不是'Hashtable'。 – Igor

+0

[当有人问约束性的链接“这是更快吗?”(https://ericlippert.com/2012/12/17/performance-rant/) – DavidG

+0

是什么让你认为一个哈希表排序什么? – Servy

回答

3

然而,是不是哈希表进行排序真实,这可能意味着,搜索可能会更快?

我不相信哈希表进行排序。

他们共享一个类似的底层实现,但Dictionary<TKey, TValue>已被推荐超过Hashtable很长一段时间,由于它消除了装箱/拆箱,这对值类型会更好。

https://referencesource.microsoft.com/#mscorlib/system/collections/hashtable.cs,77

如果你真的想知道,尝试基准它。 BenchmarkDotNet是一个伟大的图书馆。

2

Hashtable将被视为弃用,但兼容性和一些边缘情况除外,例如COM Interop

词典还提供类型安全和避免装箱过程(这使得它们在一般的快)。

但是,如果您确实想知道它具有哪些性能影响,则两种类型都使用Stopwatch跨两个相同的数据集执行相同的操作,并注意时间差异!

的代码看起来是这样的:

 Stopwatch clock = new Stopwatch(); 
     clock.Start(); 
     foreach (var item in myCol) 
     { 
      Hashtable ht = new Hashtable(); 
      //DoSomething() 
     } 
     clock.Stop(); 
     var tHash = clock.Elapsed; 
     Stopwatch clock = new Stopwatch(); 
     clock.Start(); 
     foreach (var item in myCol) 
     { 
      Dictionary<,> dict = new Dictionary<,>(); 
      //DoSomething() 
     } 
     clock.Stop(); 
     Console.Write($"Delta t = {Math.Abs((tHash - clock.Elapsed).TotalMilliseconds)}"ms); 
+0

散列表被认为是过时的?如果那是真的,他们为什么将它添加到.Net Core? – DavidG

+0

除了一些边缘情况下,它是有用的,它或许应该被视为这样的:http://stackoverflow.com/a/1590101/4700841 –

+0

有是过时的,它只能是适当在某些使用之间有很大的不同的情况。 – DavidG

相关问题