哈希表与字典:更快?

Posted

技术标签:

【中文标题】哈希表与字典:更快?【英文标题】:Hashtable vs Dictionary : Faster? 【发布时间】:2017-07-18 09:17:26 【问题描述】:

这个问题之前可能已经以许多不同的方式回答过很多次了。然而,我正在寻找更具体的东西。通用字典,我相信比哈希表更快,因为它们不需要经过装箱/拆箱的过程。

但是,哈希表没有排序,这意味着搜索会更快吗?由于密钥是经过散列和存储的,搜索时是否会涉及装箱/拆箱?

【问题讨论】:

只有在Hashtable 中使用值类型(结构)时才会进行装箱/拆箱。否则,当您想在检索条目时获取特定类型时,它只是强制转换。您还应该使用HashSet,这是一个通用查找,而不是Hashtable Obligatory link when someone asks "which is faster?" 是什么让你认为哈希表正在排序任何东西? .NET HashTable Vs Dictionary - Can the Dictionary be as fast?的可能重复 【参考方案1】:

但是,hashtable 没有排序,这可能意味着搜索可以更快?

我不相信哈希表是排序的。

它们共享相似的底层实现,但 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);

【讨论】:

Hashtable 算不算过时?如果这是真的,他们为什么将其添加到 .Net Core? 除了在少数有用的边缘情况下,可能应该这样考虑:***.com/a/1590101/4700841 过时和只适合在某些情况下使用之间有很大的区别。 你的意见很好,但说它已经过时是不正确的。 @DavidG 你的论点不成立。 MS 不会将其标记为过时,以免破坏使用它的遗留代码。这并没有改变只有遗留代码应该使用它的事实,并且如果您可以访问Dictionary,就没有理由使用它。类 已过时。

以上是关于哈希表与字典:更快?的主要内容,如果未能解决你的问题,请参考以下文章

算法设计8——全域哈希表与完全哈希表

哈希表与哈希(Hash)算法

哈希表与平衡二叉树[关闭]

哈希表与树的介绍

哈希表与红黑树

哈希表与布隆过滤器