Skip to content

Commit 92aba53

Browse files
authored
Add Parameter Filter (dotnet#2314)
Can filter benchmarks to only run cases with matching parameter values
1 parent 583db81 commit 92aba53

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ bld/
5555

5656
# Visual Studio 2017 auto generated files
5757
Generated\ Files/
58+
**/*Properties/launchSettings.json
5859

5960
# scenario intermediate directories
6061
src/scenarios/*/pub

src/benchmarks/micro/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ static int Main(string[] args)
2121
int? partitionIndex;
2222
List<string> exclusionFilterValue;
2323
List<string> categoryExclusionFilterValue;
24+
Dictionary<string, string> parameterFilterValue;
2425
bool getDiffableDisasm;
2526

2627
// Parse and remove any additional parameters that we need that aren't part of BDN
@@ -29,6 +30,7 @@ static int Main(string[] args)
2930
argsList = CommandLineOptions.ParseAndRemoveIntParameter(argsList, "--partition-index", out partitionIndex);
3031
argsList = CommandLineOptions.ParseAndRemoveStringsParameter(argsList, "--exclusion-filter", out exclusionFilterValue);
3132
argsList = CommandLineOptions.ParseAndRemoveStringsParameter(argsList, "--category-exclusion-filter", out categoryExclusionFilterValue);
33+
argsList = CommandLineOptions.ParseAndRemovePairsParameter(argsList, "--parameter-filter", out parameterFilterValue);
3234
CommandLineOptions.ParseAndRemoveBooleanParameter(argsList, "--disasm-diff", out getDiffableDisasm);
3335

3436
CommandLineOptions.ValidatePartitionParameters(partitionCount, partitionIndex);
@@ -49,6 +51,7 @@ static int Main(string[] args)
4951
partitionIndex: partitionIndex,
5052
exclusionFilterValue: exclusionFilterValue,
5153
categoryExclusionFilterValue: categoryExclusionFilterValue,
54+
parameterFilterValue: parameterFilterValue,
5255
getDiffableDisasm: getDiffableDisasm)
5356
.AddValidator(new NoWasmValidator(Categories.NoWASM)))
5457
.ToExitCode();

src/harness/BenchmarkDotNet.Extensions/CommandLineOptions.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Numerics;
34

45
namespace BenchmarkDotNet.Extensions
56
{
@@ -53,6 +54,29 @@ public static List<string> ParseAndRemoveStringsParameter(List<string> argsList,
5354
return argsList;
5455
}
5556

57+
public static List<string> ParseAndRemovePairsParameter(List<string> argsList, string parameter, out Dictionary<string, string> pairValues)
58+
{
59+
int parameterIndex = argsList.IndexOf(parameter);
60+
pairValues = new Dictionary<string, string>();
61+
62+
if (parameterIndex + 1 < argsList.Count)
63+
{
64+
while (parameterIndex + 1 < argsList.Count && !argsList[parameterIndex + 1].StartsWith("-"))
65+
{
66+
string[] pair = argsList[parameterIndex + 1].Split(":".ToCharArray(), 2);
67+
pairValues.Add(pair[0], pair[1]);
68+
argsList.RemoveAt(parameterIndex + 1);
69+
}
70+
}
71+
//We only want to remove the --exclusion-filter if it exists
72+
if (parameterIndex != -1)
73+
{
74+
argsList.RemoveAt(parameterIndex);
75+
}
76+
77+
return argsList;
78+
}
79+
5680
public static void ParseAndRemoveBooleanParameter(List<string> argsList, string parameter, out bool parameterValue)
5781
{
5882
int parameterIndex = argsList.IndexOf(parameter);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using BenchmarkDotNet.Filters;
2+
using BenchmarkDotNet.Parameters;
3+
using BenchmarkDotNet.Running;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
7+
public class ParameterFilter : IFilter
8+
{
9+
private readonly Dictionary<string, string> _parameterValues;
10+
11+
public ParameterFilter(Dictionary<string, string> parameterValues)
12+
{
13+
_parameterValues = parameterValues;
14+
}
15+
16+
public bool Predicate(BenchmarkCase benchmarkCase)
17+
{
18+
Dictionary<string, object> items = benchmarkCase.Parameters.Items.ToDictionary<ParameterInstance, string, object>(instance => instance.Name, instance => instance.Value);
19+
20+
if (_parameterValues == null)
21+
return true;
22+
23+
foreach (string key in _parameterValues.Keys)
24+
{
25+
if (!items.Keys.Contains(key))
26+
return false;
27+
if (!items[key].ToString().Equals(_parameterValues[key]))
28+
return false;
29+
}
30+
31+
return true;
32+
}
33+
}

src/harness/BenchmarkDotNet.Extensions/RecommendedConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public static IConfig Create(
2525
int? partitionIndex = null,
2626
List<string> exclusionFilterValue = null,
2727
List<string> categoryExclusionFilterValue = null,
28+
Dictionary<string, string> parameterFilterValue = null,
2829
Job job = null,
2930
bool getDiffableDisasm = false)
3031
{
@@ -54,6 +55,7 @@ public static IConfig Create(
5455
.AddFilter(new PartitionFilter(partitionCount, partitionIndex))
5556
.AddFilter(new ExclusionFilter(exclusionFilterValue))
5657
.AddFilter(new CategoryExclusionFilter(categoryExclusionFilterValue))
58+
.AddFilter(new ParameterFilter(parameterFilterValue))
5759
.AddExporter(JsonExporter.Full) // make sure we export to Json
5860
.AddColumn(StatisticColumn.Median, StatisticColumn.Min, StatisticColumn.Max)
5961
.AddValidator(TooManyTestCasesValidator.FailOnError)

0 commit comments

Comments
 (0)