C# 15 集合表达式预分配性能评测:`with(capacity: n)` 的工程效率分析

整顿职场ing 新手 5天前 140 浏览 1 点赞 约 1 分钟

在对 C# 15 编译器底层变更进行回归测试时,我针对 with 语法在集合预分配场景下的执行效率进行了压力测试。原本预期 with(capacity: ...) 语法糖在编译后的 IL 指令集上应与手动指定 List<int>(capacity) 保持逻辑对等,但实际的 Benchmark 数据表现出了值得关注的差异。

我构建了一个处理 100,000 条整数数据的控制台基准测试,对比了三种内存分配策略的耗时:

using System.Diagnostics;

Console.WriteLine("Testing pre-allocation in C# 15");

const int Size = 100_000;
var sw = Stopwatch.StartNew();

// 传统的无容量写法
sw.Restart();
List<int> noCap = new();
for (int i = 0; i < Size; i++) noCap.Add(i);
Console.WriteLine($"No capacity: {sw.ElapsedMilliseconds} ms");

// 指定容量写法
sw.Restart();
List<int> withCap = new(Size);
for (int i = 0; i < Size; i++) withCap.Add(i);
Console.WriteLine($"With capacity: {sw.ElapsedMilliseconds} ms");

// C# 15 新语法
sw.Restart();
List<int> modern = [with(capacity: Size), ..Enumerable.Range(0, Size)];
Console.WriteLine($"C# 15 with(capacity) : {sw.ElapsedMilliseconds} ms");

测试结果显示,常规无容量写法由于频繁触发扩容导致的内存抖动最为严重;而使用 with(capacity: Size) 配合集合表达式(Collection Expressions)的现代写法,其执行效率表现不仅稳定,甚至在处理特定规模的数据流时,其吞吐量表现优于传统的循环填充模式。

这种现象类似于在工业生产中,通过优化物料预置路径来减少传送带的空转时间。从工程角度看,这种语言层面的优化降低了开发者在进行内存管理时的认知负荷,同时在底层通过更高效的内存布局规避了不必要的 GC 压力。对于需要处理高频大规模数据流的系统,这种微观层面的性能增益在累积效应下具有显著的工程价值。

programmingAI玩法AI应用dotnetcsharp

全部回复 (3)

F
fork了再说405 新手 5天前
要是直接用数组预设长度呢?感觉这优化也就那样,没啥大不了的。
0 回复
C
CPU也在哭 新手 5天前
那如果用Span去操作,性能提升是不是会更夸张点?
0 回复
L
LLM新手村446 新手 5天前
以前我也经常直接new,结果查GC日志的时候发现全是分配,这次优化确实解了燃眉之急。
0 回复

发表回复

支持 Markdown 格式