我第一次看到BenchmarkDotNet和一般的基准测试。由于工作笔记本电脑上的防病毒限制,我似乎无法使用普通的BenchmarkRunner运行基准测试,所以我尝试使用InProcessEmitToolchain,如本文所述。然而,在这些示例和这里列出的示例中,我看不到实际触发基准测试的应用程序的入口点,而且我在阅读文档时也没有得到任何有用的东西。
有人能给我一个如何使用InProcessEmitToolchain和/或作业的完整示例吗?该示例解释了如何将作业与应用程序入口点结合使用来运行测试?
防病毒软件(Windows Defender(阻止BenchmarkDotNet时,我也遇到了同样的问题。我能够弄清楚如何更改工具链设置,尽管由于InProcessEmitToolchain
也被阻止,我不得不使用InProcessNoEmitToolchain
。
下面的例子实际上并没有触发防病毒,但它展示了如何定义要使用的工具链:
[Program.cs]
using BenchmarkDotNet.Running;
using Benchmarks;
_ = BenchmarkRunner.Run<MaterializeTest>();
[MaterializeTest.cs]
using BenchmarkDotNet.Attributes;
namespace Benchmarks;
[Config(typeof(AntiVirusFriendlyConfig))]
[MemoryDiagnoser]
public class MaterializeTest
{
IEnumerable<int> _sequence;
[Params(10, 100, 1000, 10000)]
public int _size;
[GlobalSetup]
public void Setup()
{
_sequence = Enumerable.Range(0, _size).Select(i => Random.Shared.Next());
}
[Benchmark]
public IReadOnlyList<int> ToList() => _sequence.ToList();
[Benchmark]
public IReadOnlyList<int> ToArray() => _sequence.ToArray();
}
[AntiVirusFriendlyConfig.cs]
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Jobs;
using BenchmarkDotNet.Toolchains.InProcess.NoEmit;
namespace Benchmarks;
public class AntiVirusFriendlyConfig : ManualConfig
{
public AntiVirusFriendlyConfig()
{
AddJob(Job.MediumRun
.WithToolchain(InProcessNoEmitToolchain.Instance));
}
}
[Bbenchmarks.csproj]
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
</ItemGroup>
</Project>
您可以使用您喜欢的工具链调整配置:
var config = DefaultConfig.Instance
.AddJob(Job
.MediumRun
.WithLaunchCount(1)
.WithToolchain(InProcessEmitToolchain.Instance));
或者
var config = DefaultConfig.Instance
.AddJob(Job
.MediumRun
.WithLaunchCount(1)
.WithToolchain(InProcessNoEmitToolchain.Instance));
并将其传递给Run方法(基于Andreas Warberg的程序(
_ = BenchmarkRunner.Run<MaterializeTest>(config);
即使使用InProcesNoEmitToolchain,我也无法解决这个问题——我们的AV软件太持久了。我通过让我们的it人员在AV软件中给我们一个文件夹白名单条目来解决这个问题,我们可以在那里运行基准测试。
我遇到了一个问题,正在进行基准测试的应用程序组件太慢了;为了避免这个问题(错误消息是takes too long to run. Prefer to use out-of-process toolchains for long-running benchmarks
(,我使用了上面其他答案给出的指导,并将其扩展到以下内容:
public class MediumConfig : ManualConfig
{
public MediumConfig()
{
AddJob(
Job.MediumRun
.WithToolchain(InProcessNoEmitToolchain.Instance)
.WithStrategy(BenchmarkDotNet.Engines.RunStrategy.Throughput)
)
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
}
}
然后像往常一样应用配置:
[Config(typeof(MediumConfig))]
public class MyBenchmarkClassThatComparesALongRunningSetOfThings
{
// ...
}