相关疑难解决方法(0)

使用Enumerable.Range消耗大量内存?

本来我想知道是否ToList比使用的构造函数分配的内存List<T>这需要一个IEnumerable<T>(没有区别).

出于测试目的,我曾经Enumerable.Range创建了一个源数组,我可以用它来创建List<int>via 1. ToList和2. constructor的实例.两者都在创建副本.

这就是我注意到以下内存消耗的巨大差异:

  1. Enumerable.Range(1, 10000000) 要么
  2. 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);
// …
Run Code Online (Sandbox Code Playgroud)

.net c# linq memory-management

7
推荐指数
1
解决办法
1484
查看次数

在这种情况下,AddRange()会比ToList()更快吗?

我有一个逗号分隔的字符串ctext,我想分割并放入一个List<string>.

会使用LINQ,

List<string> f = ctext.Split(',').ToList();
Run Code Online (Sandbox Code Playgroud)

比不使用LINQ更慢?

List<string> f;
f.AddRange(ctext.Split(','));
Run Code Online (Sandbox Code Playgroud)

似乎LINQ实际上会在某个地方复制某些东西,这会使它变得更慢,而AddRange()只是检查列表的大小一次,展开它,并将其转储.

或者有更快的方式吗?(就像使用for循环,但我怀疑它.)

c# linq list

0
推荐指数
1
解决办法
598
查看次数

标签 统计

c# ×2

linq ×2

.net ×1

list ×1

memory-management ×1