0

面对我当前的基准测试配置无法正常工作的问题,原因是我正在尝试仅运行基准测试,因为正如文档中提到的那样,我必须使用此属性[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
    }
}

我在这里缺少什么?

4

1 回答 1

1

DebugInProcessConfig 定义一个Job:_

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))
        };
}
于 2022-02-21T12:14:31.423 回答