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

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

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

【问题讨论】:

标签: c#


【解决方案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?
    • 除了在少数有用的边缘情况下,可能应该这样考虑:stackoverflow.com/a/1590101/4700841
    • 过时和只适合在某些情况下使用之间有很大的区别。
    • 你的意见很好,但说它已经过时是不正确的。
    • @DavidG 你的论点不成立。 MS 不会将其标记为过时,以免破坏使用它的遗留代码。这并没有改变只有遗留代码应该使用它的事实,并且如果您可以访问Dictionary,就没有理由使用它。类 已过时。
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 2015-01-20
    • 2013-03-21
    • 2012-08-23
    • 2014-01-04
    • 2010-10-18
    • 2011-06-10
    • 2016-01-03
    相关资源
    最近更新 更多