最初我想知道是否ToList
分配了比使用构造函数更多的内存List<T>
(IEnumerable<T>
没有区别)。
出于测试目的,我曾经Enumerable.Range
创建一个源数组,我可以使用它来创建List<int>
via 1.ToList
和 2. constructor的实例。两者都在创建副本。
这就是我注意到以下之间内存消耗的巨大差异的原因:
Enumerable.Range(1, 10000000)
或者Enumerable.Range(1, 10000000).ToArray()
当我使用第一个并调用ToList
生成的对象时,需要比数组(38,26MB/64MB)多出约 60% 的内存。
问:这是什么原因,或者我的推理错误在哪里?
var memoryBefore = GC.GetTotalMemory(true);
var range = Enumerable.Range(1, 10000000);
var rangeMem = GC.GetTotalMemory(true) - memoryBefore; // negligible
var list = range.ToList();
var memoryList = GC.GetTotalMemory(true) - memoryBefore - rangeMem;
String memInfoEnumerable = String.Format("Memory before: {0:N2} MB List: {1:N2} MB"
, (memoryBefore / 1024f) / 1024f
, (memoryList / 1024f) / 1024f);
// "Memory before: 0,11 MB List: 64,00 MB"
memoryBefore = GC.GetTotalMemory(true);
var array = Enumerable.Range(1, 10000000).ToArray();
var memoryArray = GC.GetTotalMemory(true) - memoryBefore;
list = array.ToList();
memoryList = GC.GetTotalMemory(true) - memoryArray;
String memInfoArray = String.Format("Memory before: {0:N2} MB Array: {1:N2} MB List: {2:N2} MB"
, (memoryBefore / 1024f) / 1024f
, (memoryArray / 1024f) / 1024f
, (memoryList / 1024f) / 1024f);
// "Memory before: 64,11 MB Array: 38,15 MB List: 38,26 MB"