字典与哈希表的内存使用情况对比

6

我在这里阅读到Hashtable和Dictionary基本相同,除了避免装箱/拆箱的优点。

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

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

并且

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

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

因此,这两种实现方式有着巨大的差异,不是吗?

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

如果您必须坚持使用1.1版本,是否有等效的(内存智能)选项可用于字典?


我怀疑字典是使用自平衡二叉树实现的,而不是哈希表。此外,您发现的内存消耗是垃圾回收后的还是累计总量?随着Hashtable的重新调整大小(随着越来越多的元素被添加),它可能会创建越来越多的桶(尽管旧的桶将有资格进行回收)。 - Dan Bryant
使用了700MB的哈希表中,有很多桶是空的吗? - saus
这篇文章描述了 .net HashTable 和 Dictionary 的内部实现。http://msdn.microsoft.com/en-us/library/ms379571%28v=vs.80%29.aspx - hatchet - done with SOverflow
@Dan,Dictionary<K,V>实现为哈希表。SortedDictionary<K,V>是二叉搜索树。 - svick
是的,在垃圾回收之后,内存仍然存在。 - pablo
是的,我敢打赌大多数桶都是空的。 - pablo
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接