也许这个问题已经被回答了很多次,但以许多不同的方式。然而,我正在寻找更具体的内容。我相信通用字典比哈希表更快,因为它们不需要经过装箱/拆箱的过程。
然而,哈希表是否排序,这意味着搜索可能更快?由于键是哈希和存储的,因此在搜索时会涉及到装箱/拆箱吗?
也许这个问题已经被回答了很多次,但以许多不同的方式。然而,我正在寻找更具体的内容。我相信通用字典比哈希表更快,因为它们不需要经过装箱/拆箱的过程。
然而,哈希表是否排序,这意味着搜索可能更快?由于键是哈希和存储的,因此在搜索时会涉及到装箱/拆箱吗?
然而,哈希表是否有序,这可能意味着搜索速度更快?
我不认为哈希表是有序的。
它们共享类似的底层实现,但长期以来已经推荐使用 Dictionary<TKey, TValue>
而非 Hashtable
,对于值类型的性能更好,因为它消除了装箱/拆箱。
参见 https://referencesource.microsoft.com/#mscorlib/system/collections/hashtable.cs,77
如果你真的想知道,可以尝试进行基准测试。BenchmarkDotNet 是一个很好的库。
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);
Dictionary
,就没有理由使用它。这个类确实已经过时了。 - Servy
Hashtable
中使用值类型(结构体)时,才会出现装箱 / 拆箱。否则,在检索条目时想要获取特定类型时,它只是转换而已。此外,你应该使用HashSet
,它是通用查找,而不是Hashtable
。 - Igor