最常见原因是测试类未声明为 public 或方法不满足无参 void/Task 要求;需确保 SDK 风格项目、单目标框架、禁用干扰源并稳定运行环境。

为什么 BenchmarkDotNet 的 [Benchmark] 方法没被识别?
最常见原因是没正确标记测试类或方法——BenchmarkDotNet 要求测试类必须是 public,且不能是 abstract 或嵌套类;[Benchmark] 方法也必须是 public、无参数、返回 void(或 Task,但需额外配置)。
容易踩的坑:
- 类定义写成
internal class Program或class MyBenchmarks(缺public)→ 编译通过但运行时零基准项被发现 - 方法加了参数如
public void Test(int n)→ 直接报错Method 'Test' has parameters. Only parameterless methods are supported. - 用了 async/await 但没声明返回
Task,或没加[Benchmark(Description = "...")]等属性 → 方法被忽略
运行后提示 Unable to locate output directory 或卡在 Building for .NET Core...
这是项目 SDK 和 BenchmarkDotNet 版本不匹配导致的典型构建失败。v0.13+ 默认要求使用 <project sdk="Microsoft.NET.Sdk"></project> 的 SDK 风格项目,且目标框架需显式指定(如 <targetframework>net8.0</targetframework>),不能只写 netcoreapp3.1 或留空。
实操建议:
- 确认
.csproj文件顶部有<project sdk="Microsoft.NET.Sdk"></project>,不是老式<project toolsversion="15.0"></project> - 删掉
<outputtype>Exe</outputtype>(BenchmarkDotNet 自己控制宿主进程) - 如果用的是 .NET 6+,确保安装对应 SDK,并在命令行中执行
dotnet --list-sdks验证可用版本 - 首次运行建议用
dotnet run -c Release,避免 Debug 模式下 JIT 优化被禁用影响结果
测试结果里 Mean 和 Median 差距很大,甚至出现 StdDev 远超 Mean
说明测量过程受干扰严重,不是代码本身慢,而是基准环境不稳定。常见干扰源包括:后台杀毒软件扫描、Windows Defender 实时防护、Visual Studio 调试器附加、其他高 CPU 进程、或测试方法里混入了非受控 IO(如 Console.WriteLine、File.ReadAllText)。
排查步骤:
- 关闭所有非必要程序,尤其 Chrome、IDE、OneDrive 同步服务
- 把测试逻辑包裹在
[GlobalSetup]和[GlobalCleanup]中预热数据,避免每次迭代都触发 GC 或磁盘读取 - 禁用日志输出:
Console、Debug.WriteLine全部注释;若必须调试,改用ThreadLocal<stringbuilder></stringbuilder>缓存再批量断点查看 - 用
[MemoryDiagnoser]查看是否某次迭代触发了 GC —— 若Gen0次数波动剧烈,说明对象分配模式不一致
BenchmarkSwitcher 启动后报错 Could not load file or assembly 'System.Runtime, Version=6.0.0.0'
本质是运行时绑定失败,多见于混合使用多个 TargetFramework(如同时支持 net6.0 和 net472)但未正确隔离基准类。BenchmarkDotNet 在 .NET Core / .NET 5+ 下依赖现代运行时类型,无法回退到旧版 BCL。
解决方式很直接:
- 删掉
<targetframeworks>net472;net6.0</targetframeworks>,只保留一个现代目标(推荐net8.0) - 不要在同一个程序集中混用
System.Drawing(.NET Framework 专属)或Microsoft.Win32.Registry(Windows-only)等平台限制 API - 若必须多框架测试,应拆分为独立项目,每个项目单框架,并分别用
BenchmarkSwitcher启动
真正麻烦的从来不是写几个 [Benchmark],而是让运行环境安静下来——CPU 频率锁定、后台服务暂停、JIT 预热充分、GC 状态稳定,这些细节不处理,数字再漂亮也没参考价值。



















