-
-
Couldn't load subscription status.
- Fork 1k
Open
Description
Ran into trouble adding ArgumentsSource to my benchmark and found that even the sample code does not generate the expected results (note the "?")
| Method | time | x | y | Mean | Error | StdDev | | --------------- | ----------------- | --- | --- | -------------------:| ----------------:| ----------------:| | SingleArgument | 00:00:00.0100000 | ? | ? | 15,780,658.958 ns | 53,493.3152 ns | 50,037.6802 ns | | SingleArgument | 00:00:00.1000000 | ? | ? | 110,181,308.000 ns | 517,614.3512 ns | 484,176.7852 ns | | ManyArguments | ? | 1 | 1 | 3.135 ns | 0.0852 ns | 0.1326 ns | | ManyArguments | ? | 2 | 2 | 13.571 ns | 0.2180 ns | 0.1933 ns | | ManyArguments | ? | 4 | 4 | 13.478 ns | 0.2188 ns | 0.1940 ns | | ManyArguments | ? | 10 | 10 | 13.471 ns | 0.2294 ns | 0.2034 ns | The following warning is shown:
// * Warnings * MultimodalDistribution IntroArgumentsSource.ManyArguments: Default -> It seems that the distribution is bimodal (mValue = 3.44) This occurs with .net5 or .net6 console app, built with VS 2022, using BenchmarkDotNet 0.13.2 (currently the latest stable release)
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using CommandLine; using System; using System.Collections.Generic; using System.Threading; using System.Timers; namespace BenchmarkBug { public class IntroArgumentsSource { [Benchmark] [ArgumentsSource(nameof(Numbers))] public double ManyArguments(double x, double y) => Math.Pow(x, y); public IEnumerable<object[]> Numbers() // for multiple arguments it's an IEnumerable of array of objects (object[]) { yield return new object[] { 1.0, 1.0 }; yield return new object[] { 2.0, 2.0 }; yield return new object[] { 4.0, 4.0 }; yield return new object[] { 10.0, 10.0 }; } [Benchmark] [ArgumentsSource(nameof(TimeSpans))] public void SingleArgument(TimeSpan time) => Thread.Sleep(time); public IEnumerable<object> TimeSpans() // for single argument it's an IEnumerable of objects (object) { yield return TimeSpan.FromMilliseconds(10); yield return TimeSpan.FromMilliseconds(100); } } internal class Program { static void Main(string[] args) { BenchmarkRunner.Run<IntroArgumentsSource>(); } } }