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: Sample: IntroParamsSource