哈希表与字典:更快?
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
,就没有理由使用它。类 已过时。以上是关于哈希表与字典:更快?的主要内容,如果未能解决你的问题,请参考以下文章