如何用带入口点的InProcessEmitToolchain运行BenchmarkDotNet基准测试?
完整BenchmarkDotNet InProcessEmitToolchain使用示例(含入口点+Job配置)
必要依赖
确保你的控制台项目安装了BenchmarkDotNet NuGet包:
Install-Package BenchmarkDotNet
带入口点的基础示例
以下是完整的控制台应用代码,直接在当前进程运行基准测试(规避杀毒软件对外部进程的限制):
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Running; using BenchmarkDotNet.Toolchains.InProcess.Emit; namespace InProcessBenchmarkDemo { // 基准测试类 public class StringOperationsBenchmarks { private const string TestString = "Hello BenchmarkDotNet!"; [Benchmark] public string StringConcat() => "Prefix: " + TestString; [Benchmark] public string StringFormat() => string.Format("Prefix: {0}", TestString); } class Program { // 自定义应用入口点 static void Main(string[] args) { // 配置使用InProcessEmitToolchain,避免生成外部进程 var config = ManualConfig.CreateEmpty() .AddJob(Job.Default.WithToolchain(InProcessEmitToolchain.Instance)) .AddLogger(ConsoleLogger.Default) .AddColumnProvider(DefaultColumnProviders.Instance); // 触发基准测试 BenchmarkRunner.Run<StringOperationsBenchmarks>(config); } } }
结合自定义Job的进阶配置
如果需要自定义基准测试的运行参数(比如迭代次数、GC设置),可以直接在Job中配置后结合InProcess工具链:
static void Main(string[] args) { // 自定义Job:设置迭代次数、强制GC、保留JIT优化 var customJob = Job.Default .WithToolchain(InProcessEmitToolchain.Instance) .WithIterationCount(10) // 减少迭代次数加快测试 .WithGcForce(true) // 每次迭代前强制GC .WithJitOptimizationsDisabled(false); // 保持JIT优化(默认开启) var config = ManualConfig.CreateEmpty() .AddJob(customJob) .AddLogger(ConsoleLogger.Default) .AddColumnProvider(DefaultColumnProviders.Instance); BenchmarkRunner.Run<StringOperationsBenchmarks>(config); }
关键说明
InProcessEmitToolchain.Instance:该工具链直接在当前进程编译并运行基准代码,不会生成额外的测试EXE,完美规避杀毒软件对外部进程的拦截。- 入口点必须是控制台应用的
Main方法,直接启动进程运行测试,无需依赖BenchmarkDotNet自动生成入口。 - 若需多组测试配置,可使用
AddJobs方法添加多个已配置的Job实例。
内容的提问来源于stack exchange,提问作者Thomas Parikka
相关产品推荐
相关产品推荐

