为什么sortedDictionary需要如此大的开销?

发布于 2024-11-06 05:40:21 字数 434 浏览 4 评论 0 原文

long b = GC.GetTotalMemory(true);
SortedDictionary<int, int> sd = new SortedDictionary<int, int>();
for (int i = 0; i < 10000; i++)
{
    sd.Add(i, i+1);
}
long a = GC.GetTotalMemory(true);
Console.WriteLine((a - b));            
int reference = sd[10];    

输出(32 位):

280108

输出(64 位):

480248

单独存储整数(在数组中)将需要大约 80000 个。

long b = GC.GetTotalMemory(true);
SortedDictionary<int, int> sd = new SortedDictionary<int, int>();
for (int i = 0; i < 10000; i++)
{
    sd.Add(i, i+1);
}
long a = GC.GetTotalMemory(true);
Console.WriteLine((a - b));            
int reference = sd[10];    

output (32 bit):

280108

output (64 bit):

480248

Storing the ints alone (in an array) would require about 80000.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

趁年轻赶紧闹 2024-11-13 05:40:21

SortedDictionary 内部使用 TreeSet>。该树使用 Node 并且显然它使用节点之间的引用,因此除了每个键和值之外,您还将引用左节点和右节点以及一些附加属性。 Node 是一个类,因此每个实例都有引用类型的传统开销。此外,每个节点还存储一个名为 IsRed 的布尔值。

根据 WinDbg/SOS,单个节点的大小为 64 位,即 48 字节,因此 10000 个节点将至少占用 480000 字节。

0:000> !do 0000000002a51d90 
Name:            System.Collections.Generic.SortedSet`1+Node[[System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib],[System.Int32, mscorlib]], mscorlib]]
MethodTable: 000007ff000282c8
EEClass:     000007ff00133b18
Size:        48(0x30) bytes     <== Size of a single node
File:            C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value     Name
000007feeddfd6e8  4000624       18       System.Boolean  1 instance                0     IsRed
000007feee7fd3b8  4000625       20 ...Int32, mscorlib]]  1 instance 0000000002a51db0 Item
000007ff000282c8  4000626        8 ...lib]], mscorlib]]  0 instance 0000000002a39d90 Left
000007ff000282c8  4000627       10 ...lib]], mscorlib]]  0 instance 0000000002a69d90 Right

Internally SortedDictionary<TKey, TValue> uses TreeSet<KeyValuePair<TKey, TValue>>. The tree uses Node<T> and obviously it uses references between nodes, so in addition to each key and value you will have references to left and right nodes as well as some additional properties. Node<T> is a class so each instance has the traditional overhead of a reference type. Furthermore, each node also stores a boolean called IsRed.

According to WinDbg/SOS the size of a single node on 64 bits in 48 bytes so 10000 of them will take up at least 480000 bytes.

0:000> !do 0000000002a51d90 
Name:            System.Collections.Generic.SortedSet`1+Node[[System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib],[System.Int32, mscorlib]], mscorlib]]
MethodTable: 000007ff000282c8
EEClass:     000007ff00133b18
Size:        48(0x30) bytes     <== Size of a single node
File:            C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value     Name
000007feeddfd6e8  4000624       18       System.Boolean  1 instance                0     IsRed
000007feee7fd3b8  4000625       20 ...Int32, mscorlib]]  1 instance 0000000002a51db0 Item
000007ff000282c8  4000626        8 ...lib]], mscorlib]]  0 instance 0000000002a39d90 Left
000007ff000282c8  4000627       10 ...lib]], mscorlib]]  0 instance 0000000002a69d90 Right
随心而道 2024-11-13 05:40:21

它完全取决于 SortedDictionary 类的实现,与 .net 运行时或 CLR 无关。您可以实现自己的排序字典并控制分配的内容和数量。就内存分配而言,SortedDictionary 实现可能效率不高。

It completely depends on the implementation of SortedDictionary class and nothing to do with the .net runtime or CLR. You can implement your own sorted dictionary and control what and how much is allocated. Probably SortedDictionary implementation is not much efficient in terms of memory allocation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文