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 may be instance or static. If the source is not in the same type as the benchmark, the type containing the source must be specified in the attribute constructor.
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 };
// public field getting its params from a method in another type
[ParamsSource(typeof(ParamsValues), nameof(ParamsValues.ValuesForC))]
public int C;
[Benchmark]
public void Benchmark() => Thread.Sleep(A + B + C + 5);
}
public static class ParamsValues
{
public static IEnumerable<int> ValuesForC() => new[] { 1000, 2000 };
}
}
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