【问题标题】:Dictionary vs Hashtable memory usage字典与哈希表的内存使用情况
【发布时间】:2011-10-08 02:04:13
【问题描述】:

我在 SO 上读到 Hashtable 和 Dictionary 几乎相同,除了避免装箱/拆箱的优点。

使用 Ants Profiler,我测量了一个具有以下结构的非常简单的应用程序:

class Node
{
    Dictionary<string, Node> Children = new Dictionary<string, Node>();
}

    class NodeOld
    {
        Hashtable Children = new Hashtable();
    }

好的,第一个 150 万个实例的列表大约需要 140Mb,而第二个需要超过 700Mb(64 位系统)。

所以,在实现上有很大的不同,不是吗?

Ants Profiler 在大型示例中揭示了大量 Hashtable+Bucket 对象...

那么,如果您必须坚持使用 1.1,那么字典是否有等效(记忆力强)选项?

【问题讨论】:

  • 我怀疑 Dictionary 是使用自平衡二叉树而不是哈希表实现的。另外,您在垃圾收集后发现的内存消耗还是全部累积?随着 Hashtable 自身大小的调整(随着越来越多的元素被添加),它可能会创建越来越多的 Buckets(尽管较旧的 Buckets 有资格被收集。)
  • 对于使用700MB的哈希表,是不是很多桶都是空的?
  • 这里描述了.net HashTable和Dictionary的内部实现msdn.microsoft.com/en-us/library/ms379571%28v=vs.80%29.aspx
  • @Dan, Dictionary&lt;K,V&gt; 实现为哈希表。 SortedDictionary&lt;K,V&gt; 是二叉搜索树。
  • 是的,GC后内存还在。

标签: c# dictionary hashtable


【解决方案1】:

即使我被困在 .NET 1.1 上,我也不会将 150 万个实例存储到内存中,所以我不会在意。在 .NET 1.1 中,就内存消耗和速度而言,哈希表可能是实现哈希表的最佳数据结构。当然,如果您更详细地解释了您的场景,并且您已经确定 Hashtable 实际上是您的应用程序的瓶颈,那么可能会有一些更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多