BenchmarkDotNet中是否可以动态创建基准测试?

3

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

在 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>();
    }
}
1个回答

4

参数化基准测试。在这种情况下,您可以使用ArgumentsSourceParamsSource

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 |

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接