【发布时间】: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<K,V>被实现为哈希表。SortedDictionary<K,V>是二叉搜索树。 -
是的,GC后内存还在。
标签: c# dictionary hashtable