首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在BenchmarkDotNet中动态创建基准测试吗?

可以在BenchmarkDotNet中动态创建基准测试吗?
EN

Stack Overflow用户
提问于 2022-02-22 17:42:45
回答 1查看 266关注 0票数 2

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

是否有可能在BenchmarkDotNet中执行类似的操作,并从集合中创建一组基准测试?

这将节省大量样板,特别是当对多个输入组合进行基准测试或对基准测试方法进行额外测试时。

最小示例代码:

代码语言:javascript
复制
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>();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-02-22 18:07:00

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

ArgumentsSource的例子,它在使用方式上与TestCaseSource类似:

代码语言:javascript
复制
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();
}

您可以得到一个表,如:

代码语言:javascript
复制
|       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 |
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71225946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档