我也曾遇到过Windows Defender拦截BenchmarkDotNet的问题。不过,我找到了如何更改工具链设置的方法,尽管我不得不使用InProcessNoEmitToolchain
,因为InProcessEmitToolchain
也被阻止了。
以下示例实际上并没有触发杀毒软件,但它展示了如何定义要使用哪个工具链:
[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));
}
}
[Benchmarks.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软件中添加白名单条目来解决这个问题,以便我们可以运行基准测试。
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
{
// ...
}