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
}
}
我在这里缺少什么?
DebugInProcessConfig
defines一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))
};
}
面对我当前的基准配置无法正常工作的问题,原因是我正在尝试 运行 仅基准测试,正如文档 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
}
}
我在这里缺少什么?
DebugInProcessConfig
defines一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))
};
}