gpt4 book ai didi

c# - 为什么ToArray性能有这样的行为,.Net Core 3.1?

转载 作者:行者123 更新时间:2023-12-02 02:32:05 26 4
gpt4 key购买 nike

我附加了内存测试

我编辑了问题

我基准测试ToArrayToList方法IEnumerable<int> ,我在图上从530坑到了80万。我固定了我的基准代码:

 [MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter, PlainExporter] [MemoryDiagnoser]
public class IntBenchmarks
{
private IEnumerable<int> EnumerableInts;


[Params(
// 10000 ... 1000000
)]
public int _count;

public IntBenchmarks()
{
EnumerableInts = GetEnumerableInts();
}


private IEnumerable<int> GetEnumerableInts()
{
for (var i = 0; i < _count; i++)
{
yield return 1;
}
}


[Benchmark]
public void ToArrayInt()
{
var r = EnumerableInts.ToArray();
}


[Benchmark]
public void ToListInt()
{
var r = EnumerableInts.ToList();
}

}

另外,我知道当 _count 时内存分配(有新数组的内存)等于 530000。我很感兴趣为什么分配内存时性能会更好。我有类、结构、int string 的 IEnumerable 的基准,只有 int 的 IEnumerable 有这样的行为


enter image description here

我反复检查

内存测试: enter image description here

最佳答案

EnumerableInts 中的项目数量未知。它只是一个具有任意数量项目的枚举。因此,当您调用 ToArray() 时,运行时必须分配一个大小未知的数组。然后它开始从枚举器复制项目。一旦达到数组长度,它将重新分配一个两倍长度的新数组。请参阅EnumerableHelpers.cs(76)

从枚举器返回的项目数量越多,分配的临时数组就越多。基准测试中的坑是由垃圾收集器引起的,它收集不再引用的临时数组。

关于c# - 为什么ToArray性能有这样的行为,.Net Core 3.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59808458/

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