BenchmarkDotNet InProcessEmitToolchain 完整示例

Tho*_*kka 14 c# benchmarking benchmarkdotnet

我第一次关注 BenchmarkDotNet 和一般基准测试。由于我们工作笔记本电脑上的防病毒限制,我似乎无法使用普通的 BenchmarkRunner 运行基准测试,因此我尝试使用 InProcessEmitToolchain,如此处所述然而,在这些示例和此处列出的示例中,我看不到真正会触发基准测试的应用程序的入口点,并且我在阅读文档时没有得到任何有用的信息。

谁能向我指出如何使用 InProcessEmitToolchain 和/或作业的完整示例,以解释如何将作业与应用程序入口点结合使用来运行测试?

And*_*erg 20

我遇到了与防病毒软件(Windows Defender)阻止 BenchmarkDotNet 相同的问题。我能够弄清楚如何更改工具链设置,尽管我不得不使用,InProcessNoEmitToolchain因为InProcessEmitToolchain也被阻止了。

下面的示例实际上并未触发防病毒软件,但它展示了如何定义要使用的工具链:

[程序.cs]

using BenchmarkDotNet.Running;
using Benchmarks;

_ = BenchmarkRunner.Run<MaterializeTest>();
Run Code Online (Sandbox Code Playgroud)

[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();
}
Run Code Online (Sandbox Code Playgroud)

[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));
    }
}
Run Code Online (Sandbox Code Playgroud)

[基准.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>
Run Code Online (Sandbox Code Playgroud)


cod*_*ave 6

您可以使用您喜欢的工具链调整配置:

var config = DefaultConfig.Instance
    .AddJob(Job
         .MediumRun
         .WithLaunchCount(1)
         .WithToolchain(InProcessEmitToolchain.Instance));
Run Code Online (Sandbox Code Playgroud)

或者也可以

var config = DefaultConfig.Instance
    .AddJob(Job
         .MediumRun
         .WithLaunchCount(1)
         .WithToolchain(InProcessNoEmitToolchain.Instance));
Run Code Online (Sandbox Code Playgroud)

并将其传递给 Run 方法(基于Andreas Warberg的程序构建)

_ = BenchmarkRunner.Run<MaterializeTest>(config);
Run Code Online (Sandbox Code Playgroud)