BenchmarkDotNet 运行 多次使用相同的基准

BenchmarkDotNet running same benchmark multiple times

面对我当前的基准配置无法正常工作的问题,原因是我正在尝试 运行 仅基准测试,正如文档 I 中提到的那样'使用此属性 [SimpleJob(RunStrategy.ColdStart, targetCount: 1)] 这让我误入歧途,因为从控制台我注意到我的单人工作台成立了两次。

// ***** BenchmarkRunner: Start   *****
// ***** Found 2 benchmark(s) in total *****
// ***** Building 2 exe(s) in Parallel: Start   *****

internal class Program
{
    static async Task Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args, new DebugInProcessConfig());
}

[MarkdownExporter]
[AsciiDocExporter]
[HtmlExporter]
[CsvExporter]
[RPlotExporter]
[SimpleJob(RunStrategy.ColdStart, targetCount: 1)]
public class MyBench
{
    [Params(2)] public int _anotherValueToTestWith;

    [Params(2)] public int _valueToTestWith;

    [GlobalSetup]
    public void GlobalSetup()
    {
        // ...
    }

    [GlobalCleanup]
    public void GlobalCleanup()
    {
        // CleanUp
    }

    [Benchmark]
    public void AccessTokenServiceBench()
    {
        // Perform bench
    }
}

我在这里缺少什么?

DebugInProcessConfigdefinesJob:

public override IEnumerable<Job> GetJobs()
    => new[]
    {
        Job.Default

然后您使用属性再添加一个:

[SimpleJob(RunStrategy.ColdStart, targetCount: 1)]

因此生成的配置最终有两个作业。 BDN 为每个定义的作业运行每个基准。

最简单的解决方法是定义您自己的配置,使用所需的工具链运行一次基准测试 (Job.Dry):

public class DebugInProcessConfigDry : DebugConfig
{
    public override IEnumerable<Job> GetJobs()
        => new[]
        {
            Job.Dry // Job.Dry instead of Job.Default
                .WithToolchain(
                    new InProcessEmitToolchain(
                        TimeSpan.FromHours(1), // 1h should be enough to debug the benchmark
                        true))
        };
}