C# 哈希表与字典:更快?
也许这个问题以前已经以许多不同的方式得到过多次回答。然而,我在寻找更具体的东西。我认为,通用词典比哈希表更快,因为它们不需要经历装箱/取消装箱的过程C# 哈希表与字典:更快?,c#,C#,也许这个问题以前已经以许多不同的方式得到过多次回答。然而,我在寻找更具体的东西。我认为,通用词典比哈希表更快,因为它们不需要经历装箱/取消装箱的过程 但是,哈希表是否已排序,这意味着搜索可能会更快?由于密钥是散列和存储的,搜索时是否会涉及装箱/取消装箱?哈希表被视为不推荐使用,但后向兼容性和一些边缘情况除外,如COM Interop 字典还提供了类型安全性,避免了装箱过程(这通常会使它们更快) 但是,如果您确实想知道它对性能有什么影响,请使用Stopwatch记录两种类型在两个相同的数据集中执行
但是,哈希表是否已排序,这意味着搜索可能会更快?由于密钥是散列和存储的,搜索时是否会涉及装箱/取消装箱?
哈希表
被视为不推荐使用,但后向兼容性和一些边缘情况除外,如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);
秒表时钟=新秒表();
clock.Start();
foreach(mycl中的变量项)
{
Hashtable ht=新的Hashtable();
//DoSomething()
}
时钟停止();
var tHash=时钟已过;
秒表时钟=新秒表();
clock.Start();
foreach(mycl中的变量项)
{
Dictionary dict=新字典();
//DoSomething()
}
时钟停止();
Write($“Delta t={Math.Abs((tHash-clock.appeased.total毫秒)}”ms);
然而,哈希表是否已排序,这可能意味着搜索速度可能会更快
我不相信哈希表是经过排序的
它们共享一个类似的底层实现,但长期以来,人们推荐使用Dictionary
而不是Hashtable
,这将更好地执行值类型,因为它消除了装箱/取消装箱
看
如果你真的想知道,试试基准测试。这是一个很好的库。只有在
哈希表中使用值类型(struct)时,才会进行装箱/取消装箱。否则,当您在检索条目时想要获取特定类型时,它只是强制转换。您还应该使用HashSet
,这是一种通用查找,而不是Hashtable
。是什么让您认为哈希表正在对任何内容进行排序?哈希表的可能重复项将被视为过时?如果这是真的,为什么他们要将它添加到.Net Core中?除了在一些边缘情况下它是有用的,它可能应该被认为是这样的:过时和只适合在某些情况下使用之间有很大的区别。你的意见是好的,但称它为过时是不正确的。@DavidG你的论点没有遵循。MS不会将其标记为过时,以免破坏使用它的遗留代码。这并没有改变这样一个事实,即只有遗留代码应该使用它,而且如果您可以访问字典
,就没有理由使用它。该类已过时。