【发布时间】:2026-02-24 16:30:01
【问题描述】:
我附上了内存测试
我编辑了问题
我在IEnumerable<int> 上对ToArray 和ToList 方法进行了基准测试,我在图形上看到了从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 时,内存分配(有新数组的内存)。我很感兴趣为什么分配内存时性能更好。我有 IEnumerable 的 class、struct、int string 的基准,只有 int 的 IEnumerable 有这样的行为
我反复检查过
【问题讨论】:
-
.NET Framework 还是 .NET Core?
-
我很惊讶
ToArray更快。我敢打赌ToList会更快,因为它涉及的步骤更少。 (Is it better to call ToList() or ToArray() in LINQ queries?)。您是否也在 .NET Framework 上对其进行了测试? -
ToList在 .net core 和 .net framework 中的实现是不同的。我没有在.net 框架上测试它,但我知道ToList在那里更好,因为ToArray方法在内部调用ToList。但是.net 核心开发人员重写了ToArray,现在速度更快了。 @TheodorZoulias -
我可以看到还有13万和26万起的小坑。看来坑是按照内部缓冲区的resize模式(变满时大小翻倍)。
-
是的,我同意,但我不明白为什么?这可能是 JIT 技巧@TheodorZoulias
标签: c# arrays performance