用途:为 MSBuild 引擎代码的性能优化提供指导,适用于处理评估或执行热路径、减少内存分配、选择合适集合类型等场景。核心原则是先测量再优化,使用 BenchmarkDotNet、评估分析器(/profileevaluation)或 ETW 跟踪定位真实瓶颈。
主要能力与规则:热路径避免 LINQ(Where、Select、Any、First 会分配枚举器与委托闭包),改用 foreach;避免格式化字符串分配,使用 string.Concat、Span<T> 插值或复用 StringBuilder;短生命周期缓冲区优先 Span<T> 与 stackalloc,避免 Substring。字符串比较方面,属性/项/目标名用 MSBuildNameIgnoreCaseComparer,通用标识符用 StringComparison.OrdinalIgnoreCase,Windows 路径用 OrdinalIgnoreCase,Linux 路径用 Ordinal;禁止用 ToLower()/ToUpper() 比较,禁止对 MSBuild 标识符使用 CurrentCulture。集合选择:少量固定项用数组或 ReadOnlySpan<T>,一次构建多次读取用 ImmutableArray<T>(而非 ImmutableList<T>),键查找多项用 Dictionary 配适当比较器,少量项(<5)用线性扫描,并发读少写用 ImmutableDictionary 或快照,需有序迭代用 List<T> 或数组。
热路径区域:Expander.cs、Evaluator.cs、ItemSpec.cs/LazyItemEvaluator.cs、TaskExecutionHost.cs 及文件 I/O 路径(FileMatcher.cs、glob、项目加载)。内联方面可对小而高频方法使用 AggressiveInlining,避免内层循环虚调用,使用结构枚举器。评估性能:导入链深度线性影响评估时间,glob 按项目评估,过宽模式(**/*)开销大,条件评估应短路且廉价检查在前,属性函数比内置操作慢。
反模式:items.Count() > 0 应改 Any() 或 Count 属性;低重要性日志中的 string.Format 应改结构化日志或按详细级别守卫;new List<T>(enumerable).ToArray() 应直接 ToArray();ContainsKey 后索引应改 TryGetValue;循环中未编译正则应编译或使用静态 Regex 字段。
限制:资料未提供具体安装命令、收费信息或平台支持范围。