Sample: IntroParamsSource
In case you want to use a lot of values, you should use
[ParamsSource]
You can mark one or several fields or properties in your class by the
[Params]
attribute.
In this attribute, you have to specify the name of public method/property which is going to provide the values
(something that implements IEnumerable
).
The source must be within benchmarked type!
Source code
using System.Collections.Generic;
using System.Threading;
using BenchmarkDotNet.Attributes;
namespace BenchmarkDotNet.Samples
{
public class IntroParamsSource
{
// property with public setter
[ParamsSource(nameof(ValuesForA))]
public int A { get; set; }
// public field
[ParamsSource(nameof(ValuesForB))]
public int B;
// public property
public IEnumerable<int> ValuesForA => new[] { 100, 200 };
// public static method
public static IEnumerable<int> ValuesForB() => new[] { 10, 20 };
[Benchmark]
public void Benchmark() => Thread.Sleep(A + B + 5);
}
}
Output
| Method | B | A | Mean | Error | StdDev |
|---------- |--- |---- |---------:|--------:|--------:|
| Benchmark | 10 | 100 | 115.5 ms | 0.17 ms | 0.16 ms |
| Benchmark | 10 | 200 | 215.6 ms | 0.15 ms | 0.14 ms |
| Benchmark | 20 | 100 | 125.5 ms | 0.19 ms | 0.18 ms |
| Benchmark | 20 | 200 | 225.5 ms | 0.23 ms | 0.22 ms |
Remarks
A remark about IParam.
You don't need to use IParam
anymore since 0.11.0
.
Just use complex types as you wish and override ToString
method to change the display names used in the results.
Links
- Parameterization
- The permanent link to this sample: BenchmarkDotNet.Samples.IntroParamsSource