gpt4 book ai didi

C# List 大小与 double[] 大小

转载 作者:太空狗 更新时间:2023-10-29 22:07:45 25 4
gpt4 key购买 nike

所以我只是在测试 CLR Profiler来自微软,我做了一个小程序,创建了一个包含 1,000,000 个 double 的列表。我检查了堆,发现 List<> 的大小约为 124KB(我记不太清了,但大概是这个大小)。这真的震撼了我的世界,如果它有 100 万个 double ,它怎么会是 124KB?不管怎样,在那之后我决定检查一个 double[1000000]。令我惊讶的是(实际上不是因为这是我对 List<> =P 的预期),数组大小为 7.6MB。巨大的差异!!

为什么不一样? List<> 是如何管理其内存效率如此(令人难以置信)的项目的?我的意思是,这不像其他 7.5 MB 在其他地方,因为在我创建了 100 万个 double 之后,应用程序的大小大约增加了 3 或 4 KB。

最佳答案

List<T>使用数组来存储值/引用,所以我怀疑除了很少的开销外,大小会有任何差异List<T>添加。

给出下面的代码

var size = 1000000;
var numbers = new List<double>(size);
for (int i = 0; i < size; i++) {
numbers.Add(0d);
}

相关对象的堆看起来像这样

0:000> !dumpheap -type Generic.List  
Address MT Size
01eb29a4 662ed948 24
total 1 objects
Statistics:
MT Count TotalSize Class Name
662ed948 1 24 System.Collections.Generic.List`1[[System.Double, mscorlib]]
Total 1 objects

0:000> !objsize 01eb29a4 <=== Get the size of List<Double>
sizeof(01eb29a4) = 8000036 ( 0x7a1224) bytes (System.Collections.Generic.List`1[[System.Double, mscorlib]])

0:000> !do 01eb29a4
Name: System.Collections.Generic.List`1[[System.Double, mscorlib]]
MethodTable: 662ed948
EEClass: 65ad84f8
Size: 24(0x18) bytes
(C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
65cd1d28 40009d8 4 System.Double[] 0 instance 02eb3250 _items <=== The array holding the data
65ccaaf0 40009d9 c System.Int32 1 instance 1000000 _size
65ccaaf0 40009da 10 System.Int32 1 instance 1000000 _version
65cc84c0 40009db 8 System.Object 0 instance 00000000 _syncRoot
65cd1d28 40009dc 0 System.Double[] 0 shared static _emptyArray
>> Domain:Value dynamic statics NYI
00505438:NotInit <<

0:000> !objsize 02eb3250 <=== Get the size of the array holding the data
sizeof(02eb3250) = 8000012 ( 0x7a120c) bytes (System.Double[])

所以 List<double>是 8,000,036 字节,底层数组是 8,000,012 字节。这非常适合引用类型 ( Array ) 通常的 12 字节开销和 double 的 1,000,000 乘以 8 字节。最重要的是List<T>为上面显示的字段添加另外 24 个字节的开销。

结论:我没有看到任何证据表明 List<double>将占用比 double[] 更少的空间对于相同数量的元素。

关于C# List<double> 大小与 double[] 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com