1

在编写单元测试时,我们可以通过简单地将元素添加到集合中来添加更多测试用例,例如TestCaseSource在 NUnit 中使用。

是否可以在 BenchmarkDotNet 中做类似的事情,并从集合中创建一组基准?

这将节省大量样板文件,尤其是在对多个输入组合进行基准测试或对基准方法进行额外测试时。

最小示例代码:

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

public interface IAlgorithm
{
    public void DoWork();
}

public class AlgorithmA: IAlgorithm
{
    public void DoWork() { } // something slow
}

public class AlgorithmB : IAlgorithm
{
    public void DoWork() { } // something slow
}

public class MyBenchmarks
{
    AlgorithmA classA = new AlgorithmA();
    AlgorithmB classB = new AlgorithmB();

    [Benchmark]
    public void A() => classA.DoWork();

    [Benchmark]
    public void B() => classB.DoWork();
}

public class WhatIWouldLike
{
    IAlgorithm[] classes = new IAlgorithm[] { new AlgorithmA(), new AlgorithmB() };

    // ...automatically create a benchmark for DoWork() on element of the array
}

class Program
{
    static void Main(string[] args)
    {
        BenchmarkRunner.Run<MyBenchmarks>();
    }
}
4

1 回答 1

2

参数化的基准。在这种情况下,您可以使用 aArgumentsSourceParamsSource

的示例,在您如何使用它方面ArgumentsSource类似于:TestCaseSource

public class Algorithm1: IAlgorithm {
    public void DoWork() {
        ...
    }

    // override ToString so that we have a more readable table of results
    public override string ToString() => "Algorithm 1";
}

public class Algorithm2: IAlgorithm {
    public void DoWork() {
        ...
    }
    public override string ToString() => "Algorithm 2";
}

public class MyBenchmarks {
    public IEnumerable<IAlgorithm> Algorithms() {
        yield return new Algorithm1();
        yield return new Algorithm2();
        // add more algorithms here if needed
    }

    [Benchmark]
    [ArgumentsSource(nameof(Algorithms))]
    public void RunAlgorithm(IAlgorithm algorithm) => algorithm.DoWork();
}

你可以得到一个表,例如:

|       Method |   algorithm |     Mean |     Error |    StdDev |
|------------- |------------ |---------:|----------:|----------:|
| RunAlgorithm | Algorithm 1 | 1.146 ms | 0.0065 ms | 0.0061 ms |
| RunAlgorithm | Algorithm 2 | 2.223 ms | 0.0120 ms | 0.0106 ms |
于 2022-02-22T18:07:00.513 回答