Skip to content

Commit e0adbb9

Browse files
committed
Optimize DefaultOrderer.GetLogicalGroupKey.
1 parent 415ac91 commit e0adbb9

7 files changed

+45
-38
lines changed

src/BenchmarkDotNet/Order/DefaultOrderer.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,6 @@ public string GetHighlightGroupKey(BenchmarkCase benchmarkCase)
8989

9090
public string GetLogicalGroupKey(ImmutableArray<BenchmarkCase> allBenchmarksCases, BenchmarkCase benchmarkCase)
9191
{
92-
// TODO: GetLogicalGroupKey is called for every benchmarkCase, so as the number of cases grows, this can get very expensive to recompute for each call.
93-
// We should somehow amortize the cost by computing it only once per summary.
94-
var paramSets = allBenchmarksCases.Select(benchmarkCase => benchmarkCase.Parameters).Distinct(ParameterEqualityComparer.Instance).ToArray();
95-
9692
var explicitRules = benchmarkCase.Config.GetLogicalGroupRules().ToList();
9793
var implicitRules = new List<BenchmarkLogicalGroupRule>();
9894
bool hasJobBaselines = allBenchmarksCases.Any(b => b.Job.Meta.Baseline);
@@ -129,7 +125,7 @@ public string GetLogicalGroupKey(ImmutableArray<BenchmarkCase> allBenchmarksCase
129125
keys.Add(benchmarkCase.Job.DisplayInfo);
130126
break;
131127
case BenchmarkLogicalGroupRule.ByParams:
132-
keys.Add($"DistinctParamSet{Array.FindIndex(paramSets, (paramSet) => ParameterEqualityComparer.Instance.Equals(paramSet, benchmarkCase.Parameters))}");
128+
keys.Add($"DistinctParamSet{allBenchmarksCases.IndexOf(benchmarkCase, BenchmarkParamsEqualityComparer.Instance)}");
133129
break;
134130
case BenchmarkLogicalGroupRule.ByCategory:
135131
keys.Add(string.Join(",", benchmarkCase.Descriptor.Categories));
@@ -213,6 +209,17 @@ public int Compare(BenchmarkCase x, BenchmarkCase y)
213209
}
214210
}
215211

212+
private sealed class BenchmarkParamsEqualityComparer : IEqualityComparer<BenchmarkCase>
213+
{
214+
internal static readonly BenchmarkParamsEqualityComparer Instance = new();
215+
216+
bool IEqualityComparer<BenchmarkCase>.Equals(BenchmarkCase x, BenchmarkCase y)
217+
=> ParameterEqualityComparer.Instance.Equals(x.Parameters, y.Parameters);
218+
219+
int IEqualityComparer<BenchmarkCase>.GetHashCode(BenchmarkCase obj)
220+
=> ParameterEqualityComparer.Instance.GetHashCode(obj.Parameters);
221+
}
222+
216223
private class LogicalGroupComparer : IComparer<IGrouping<string, BenchmarkCase>>
217224
{
218225
private readonly IComparer<BenchmarkCase> benchmarkComparer;

tests/BenchmarkDotNet.Tests/Exporters/VerifiedFiles/MarkdownExporterVerifyTests.GroupExporterTest_JobBaseline_MethodsParamsJobs.verified.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ Frequency: 2531248 Hz, Resolution: 395.062 ns, Timer: TSC
1919
Bar | Job1 | 2 | 314.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.04 | 1 | DistinctParamSet0-JobBaseline_MethodsParamsJobs.Bar | Yes |
2020
Bar | Job2 | 2 | 614.5 ns | 5.88 ns | 8.80 ns | 1.96 | 0.06 | 2 | DistinctParamSet0-JobBaseline_MethodsParamsJobs.Bar | No |
2121
| | | | | | | | | | |
22-
Base | Job1 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet1-JobBaseline_MethodsParamsJobs.Base | Yes | ^
23-
Base | Job2 | 10 | 1,014.5 ns | 5.88 ns | 8.80 ns | 1.42 | 0.02 | 2 | DistinctParamSet1-JobBaseline_MethodsParamsJobs.Base | No |
22+
Base | Job1 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet6-JobBaseline_MethodsParamsJobs.Base | Yes | ^
23+
Base | Job2 | 10 | 1,014.5 ns | 5.88 ns | 8.80 ns | 1.42 | 0.02 | 2 | DistinctParamSet6-JobBaseline_MethodsParamsJobs.Base | No |
2424
| | | | | | | | | | |
25-
Foo | Job1 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet1-JobBaseline_MethodsParamsJobs.Foo | Yes |
26-
Foo | Job2 | 10 | 1,114.5 ns | 5.88 ns | 8.80 ns | 1.37 | 0.02 | 2 | DistinctParamSet1-JobBaseline_MethodsParamsJobs.Foo | No |
25+
Foo | Job1 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet6-JobBaseline_MethodsParamsJobs.Foo | Yes |
26+
Foo | Job2 | 10 | 1,114.5 ns | 5.88 ns | 8.80 ns | 1.37 | 0.02 | 2 | DistinctParamSet6-JobBaseline_MethodsParamsJobs.Foo | No |
2727
| | | | | | | | | | |
28-
Bar | Job1 | 10 | 914.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | DistinctParamSet1-JobBaseline_MethodsParamsJobs.Bar | Yes |
29-
Bar | Job2 | 10 | 1,214.5 ns | 5.88 ns | 8.80 ns | 1.33 | 0.02 | 2 | DistinctParamSet1-JobBaseline_MethodsParamsJobs.Bar | No |
28+
Bar | Job1 | 10 | 914.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | DistinctParamSet6-JobBaseline_MethodsParamsJobs.Bar | Yes |
29+
Bar | Job2 | 10 | 1,214.5 ns | 5.88 ns | 8.80 ns | 1.33 | 0.02 | 2 | DistinctParamSet6-JobBaseline_MethodsParamsJobs.Bar | No |
3030

3131
Errors: 0

tests/BenchmarkDotNet.Tests/Exporters/VerifiedFiles/MarkdownExporterVerifyTests.GroupExporterTest_MethodBaseline_MethodsParams.verified.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ Frequency: 2531248 Hz, Resolution: 395.062 ns, Timer: TSC
1313
Foo | 2 | 214.5 ns | 5.88 ns | 8.80 ns | 1.88 | 0.16 | 2 | DistinctParamSet0-DefaultJob | No |
1414
Bar | 2 | 314.5 ns | 5.88 ns | 8.80 ns | 2.76 | 0.22 | 3 | DistinctParamSet0-DefaultJob | No |
1515
| | | | | | | | | |
16-
Base | 10 | 414.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.03 | 1 | DistinctParamSet1-DefaultJob | Yes | ^
17-
Foo | 10 | 514.5 ns | 5.88 ns | 8.80 ns | 1.24 | 0.03 | 2 | DistinctParamSet1-DefaultJob | No |
18-
Bar | 10 | 614.5 ns | 5.88 ns | 8.80 ns | 1.48 | 0.04 | 3 | DistinctParamSet1-DefaultJob | No |
16+
Base | 10 | 414.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.03 | 1 | DistinctParamSet3-DefaultJob | Yes | ^
17+
Foo | 10 | 514.5 ns | 5.88 ns | 8.80 ns | 1.24 | 0.03 | 2 | DistinctParamSet3-DefaultJob | No |
18+
Bar | 10 | 614.5 ns | 5.88 ns | 8.80 ns | 1.48 | 0.04 | 3 | DistinctParamSet3-DefaultJob | No |
1919

2020
Errors: 0

tests/BenchmarkDotNet.Tests/Exporters/VerifiedFiles/MarkdownExporterVerifyTests.GroupExporterTest_MethodBaseline_MethodsParamsJobs.verified.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ Frequency: 2531248 Hz, Resolution: 395.062 ns, Timer: TSC
1818
Foo | Job2 | 2 | 514.5 ns | 5.88 ns | 8.80 ns | 1.24 | 0.03 | 2 | DistinctParamSet0-Job2 | No |
1919
Bar | Job2 | 2 | 614.5 ns | 5.88 ns | 8.80 ns | 1.48 | 0.04 | 3 | DistinctParamSet0-Job2 | No |
2020
| | | | | | | | | | |
21-
Base | Job1 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet1-Job1 | Yes | ^
22-
Foo | Job1 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.14 | 0.02 | 2 | DistinctParamSet1-Job1 | No |
23-
Bar | Job1 | 10 | 914.5 ns | 5.88 ns | 8.80 ns | 1.28 | 0.02 | 3 | DistinctParamSet1-Job1 | No |
21+
Base | Job1 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet6-Job1 | Yes | ^
22+
Foo | Job1 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.14 | 0.02 | 2 | DistinctParamSet6-Job1 | No |
23+
Bar | Job1 | 10 | 914.5 ns | 5.88 ns | 8.80 ns | 1.28 | 0.02 | 3 | DistinctParamSet6-Job1 | No |
2424
| | | | | | | | | | |
25-
Base | Job2 | 10 | 1,014.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | DistinctParamSet1-Job2 | Yes |
26-
Foo | Job2 | 10 | 1,114.5 ns | 5.88 ns | 8.80 ns | 1.10 | 0.01 | 2 | DistinctParamSet1-Job2 | No |
27-
Bar | Job2 | 10 | 1,214.5 ns | 5.88 ns | 8.80 ns | 1.20 | 0.01 | 3 | DistinctParamSet1-Job2 | No |
25+
Base | Job2 | 10 | 1,014.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | DistinctParamSet6-Job2 | Yes |
26+
Foo | Job2 | 10 | 1,114.5 ns | 5.88 ns | 8.80 ns | 1.10 | 0.01 | 2 | DistinctParamSet6-Job2 | No |
27+
Bar | Job2 | 10 | 1,214.5 ns | 5.88 ns | 8.80 ns | 1.20 | 0.01 | 3 | DistinctParamSet6-Job2 | No |
2828

2929
Errors: 0

tests/BenchmarkDotNet.Tests/Exporters/VerifiedFiles/MarkdownExporterVerifyTests.GroupExporterTest_MethodJobBaseline_MethodsJobsParams.verified.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ Frequency: 2531248 Hz, Resolution: 395.062 ns, Timer: TSC
1515
Foo | Job2 | 2 | 314.5 ns | 5.88 ns | 8.80 ns | 2.76 | 0.22 | 3 | DistinctParamSet0 | No |
1616
Bar | Job2 | 2 | 414.5 ns | 5.88 ns | 8.80 ns | 3.64 | 0.29 | 4 | DistinctParamSet0 | No |
1717
| | | | | | | | | | |
18-
Foo | Job1 | 10 | 514.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet1 | Yes | ^
19-
Bar | Job1 | 10 | 614.5 ns | 5.88 ns | 8.80 ns | 1.19 | 0.03 | 2 | DistinctParamSet1 | No |
20-
Foo | Job2 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.39 | 0.03 | 3 | DistinctParamSet1 | No |
21-
Bar | Job2 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.58 | 0.03 | 4 | DistinctParamSet1 | No |
18+
Foo | Job1 | 10 | 514.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | DistinctParamSet4 | Yes | ^
19+
Bar | Job1 | 10 | 614.5 ns | 5.88 ns | 8.80 ns | 1.19 | 0.03 | 2 | DistinctParamSet4 | No |
20+
Foo | Job2 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.39 | 0.03 | 3 | DistinctParamSet4 | No |
21+
Bar | Job2 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.58 | 0.03 | 4 | DistinctParamSet4 | No |
2222

2323
Errors: 0

tests/BenchmarkDotNet.Tests/Exporters/VerifiedFiles/MarkdownExporterVerifyTests.GroupExporterTest_NoBaseline_MethodsParamsJobs_GroupByCategory.verified.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@ Frequency: 2531248 Hz, Resolution: 395.062 ns, Timer: TSC
1616
A1 | Job2 | 2 | 314.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.04 | 1 | CatA-DistinctParamSet0-Job2 | Yes |
1717
A2 | Job2 | 2 | 414.5 ns | 5.88 ns | 8.80 ns | 1.32 | 0.05 | 2 | CatA-DistinctParamSet0-Job2 | No |
1818
| | | | | | | | | | |
19-
A1 | Job1 | 10 | 514.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | CatA-DistinctParamSet1-Job1 | Yes | ^
20-
A2 | Job1 | 10 | 614.5 ns | 5.88 ns | 8.80 ns | 1.19 | 0.03 | 2 | CatA-DistinctParamSet1-Job1 | No |
19+
A1 | Job1 | 10 | 514.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | CatA-DistinctParamSet4-Job1 | Yes | ^
20+
A2 | Job1 | 10 | 614.5 ns | 5.88 ns | 8.80 ns | 1.19 | 0.03 | 2 | CatA-DistinctParamSet4-Job1 | No |
2121
| | | | | | | | | | |
22-
A1 | Job2 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | CatA-DistinctParamSet1-Job2 | Yes |
23-
A2 | Job2 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.14 | 0.02 | 2 | CatA-DistinctParamSet1-Job2 | No |
22+
A1 | Job2 | 10 | 714.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.02 | 1 | CatA-DistinctParamSet4-Job2 | Yes |
23+
A2 | Job2 | 10 | 814.5 ns | 5.88 ns | 8.80 ns | 1.14 | 0.02 | 2 | CatA-DistinctParamSet4-Job2 | No |
2424
| | | | | | | | | | |
2525
B1 | Job1 | 2 | 914.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | CatB-DistinctParamSet0-Job1 | Yes | ^
2626
B2 | Job1 | 2 | 1,014.5 ns | 5.88 ns | 8.80 ns | 1.11 | 0.01 | 2 | CatB-DistinctParamSet0-Job1 | No |
2727
| | | | | | | | | | |
2828
B1 | Job2 | 2 | 1,114.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | CatB-DistinctParamSet0-Job2 | Yes |
2929
B2 | Job2 | 2 | 1,214.5 ns | 5.88 ns | 8.80 ns | 1.09 | 0.01 | 2 | CatB-DistinctParamSet0-Job2 | No |
3030
| | | | | | | | | | |
31-
B1 | Job1 | 10 | 1,314.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | CatB-DistinctParamSet1-Job1 | Yes | ^
32-
B2 | Job1 | 10 | 1,414.5 ns | 5.88 ns | 8.80 ns | 1.08 | 0.01 | 2 | CatB-DistinctParamSet1-Job1 | No |
31+
B1 | Job1 | 10 | 1,314.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | CatB-DistinctParamSet4-Job1 | Yes | ^
32+
B2 | Job1 | 10 | 1,414.5 ns | 5.88 ns | 8.80 ns | 1.08 | 0.01 | 2 | CatB-DistinctParamSet4-Job1 | No |
3333
| | | | | | | | | | |
34-
B1 | Job2 | 10 | 1,514.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | CatB-DistinctParamSet1-Job2 | Yes |
35-
B2 | Job2 | 10 | 1,614.5 ns | 5.88 ns | 8.80 ns | 1.07 | 0.01 | 2 | CatB-DistinctParamSet1-Job2 | No |
34+
B1 | Job2 | 10 | 1,514.5 ns | 5.88 ns | 8.80 ns | 1.00 | 0.01 | 1 | CatB-DistinctParamSet4-Job2 | Yes |
35+
B2 | Job2 | 10 | 1,614.5 ns | 5.88 ns | 8.80 ns | 1.07 | 0.01 | 2 | CatB-DistinctParamSet4-Job2 | No |
3636

3737
Errors: 0

tests/BenchmarkDotNet.Tests/Exporters/VerifiedFiles/MarkdownExporterVerifyTests.GroupExporterTest_NoBaseline_MethodsParamsJobs_GroupByParams.verified.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ Frequency: 2531248 Hz, Resolution: 395.062 ns, Timer: TSC
1717
Foo | Job2 | 2 | 714.5 ns | 5.88 ns | 8.80 ns | 5 | DistinctParamSet0 | No |
1818
Bar | Job2 | 2 | 814.5 ns | 5.88 ns | 8.80 ns | 6 | DistinctParamSet0 | No |
1919
| | | | | | | | |
20-
Base | Job1 | 10 | 314.5 ns | 5.88 ns | 8.80 ns | 1 | DistinctParamSet1 | No | ^
21-
Base | Job2 | 10 | 414.5 ns | 5.88 ns | 8.80 ns | 2 | DistinctParamSet1 | No |
22-
Foo | Job1 | 10 | 914.5 ns | 5.88 ns | 8.80 ns | 3 | DistinctParamSet1 | No |
23-
Bar | Job1 | 10 | 1,014.5 ns | 5.88 ns | 8.80 ns | 4 | DistinctParamSet1 | No |
24-
Foo | Job2 | 10 | 1,114.5 ns | 5.88 ns | 8.80 ns | 5 | DistinctParamSet1 | No |
25-
Bar | Job2 | 10 | 1,214.5 ns | 5.88 ns | 8.80 ns | 6 | DistinctParamSet1 | No |
20+
Base | Job1 | 10 | 314.5 ns | 5.88 ns | 8.80 ns | 1 | DistinctParamSet6 | No | ^
21+
Base | Job2 | 10 | 414.5 ns | 5.88 ns | 8.80 ns | 2 | DistinctParamSet6 | No |
22+
Foo | Job1 | 10 | 914.5 ns | 5.88 ns | 8.80 ns | 3 | DistinctParamSet6 | No |
23+
Bar | Job1 | 10 | 1,014.5 ns | 5.88 ns | 8.80 ns | 4 | DistinctParamSet6 | No |
24+
Foo | Job2 | 10 | 1,114.5 ns | 5.88 ns | 8.80 ns | 5 | DistinctParamSet6 | No |
25+
Bar | Job2 | 10 | 1,214.5 ns | 5.88 ns | 8.80 ns | 6 | DistinctParamSet6 | No |
2626

2727
Errors: 0

0 commit comments

Comments
 (0)