我原本想知道ToList
是否比使用带有IEnumerable<T>
参数的List<T>
构造函数(没有区别)分配了更多的内存。
为了测试目的,我使用Enumerable.Range
创建了一个源数组,以便通过1.ToList
和2.构造函数创建List<int>
的实例。这两个都是创建副本。
这就是我注意到以下内容内存消耗差异极大的方式:
Enumerable.Range(1, 10000000)
或者Enumerable.Range(1, 10000000).ToArray()
当我使用第一个并调用ToList
时,结果对象需要的内存约为数组的60%(38.26MB/64MB)。
问题:这是什么原因或我的推理出现了错误?
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"
list.TrimExcess();
而不是初始化列表到确切的大小。 - Marcrange.Count()
初始化列表,然后使用AddRange(range)
。 - Tim Schmelter