44using System . Diagnostics . CodeAnalysis ;
55using System . Linq ;
66using BenchmarkDotNet . Configs ;
7+ using BenchmarkDotNet . Extensions ;
78using BenchmarkDotNet . Jobs ;
89using BenchmarkDotNet . Parameters ;
910using BenchmarkDotNet . Reports ;
@@ -20,7 +21,8 @@ public class DefaultOrderer : IOrderer
2021 private readonly IComparer < string [ ] > categoryComparer = CategoryComparer . Instance ;
2122 private readonly IComparer < ParameterInstances > paramsComparer = ParameterComparer . Instance ;
2223 private readonly IComparer < Job > jobComparer = JobComparer . Instance ;
23- private readonly IComparer < Descriptor > targetComparer ;
24+ private readonly IComparer < Descriptor > typeComparer = TypeComparer . Instance ;
25+ private readonly IComparer < Descriptor > methodComparer ;
2426
2527 public SummaryOrderPolicy SummaryOrderPolicy { get ; }
2628 public MethodOrderPolicy MethodOrderPolicy { get ; }
@@ -31,15 +33,15 @@ public DefaultOrderer(
3133 {
3234 SummaryOrderPolicy = summaryOrderPolicy ;
3335 MethodOrderPolicy = methodOrderPolicy ;
34- targetComparer = new DescriptorComparer ( methodOrderPolicy ) ;
36+ methodComparer = new MethodComparer ( methodOrderPolicy ) ;
3537 }
3638
3739 [ PublicAPI ]
3840 public virtual IEnumerable < BenchmarkCase > GetExecutionOrder (
3941 ImmutableArray < BenchmarkCase > benchmarkCases ,
4042 IEnumerable < BenchmarkLogicalGroupRule > order = null )
4143 {
42- var benchmarkComparer = new BenchmarkComparer ( categoryComparer , paramsComparer , jobComparer , targetComparer , order ) ;
44+ var benchmarkComparer = new BenchmarkComparer ( categoryComparer , paramsComparer , jobComparer , typeComparer , methodComparer , order ) ;
4345 var list = benchmarkCases . ToList ( ) ;
4446 list . Sort ( benchmarkComparer ) ;
4547 return list ;
@@ -87,8 +89,15 @@ public string GetLogicalGroupKey(ImmutableArray<BenchmarkCase> allBenchmarksCase
8789 {
8890 var explicitRules = benchmarkCase . Config . GetLogicalGroupRules ( ) . ToList ( ) ;
8991 var implicitRules = new List < BenchmarkLogicalGroupRule > ( ) ;
92+
93+ bool hasMultipleTypes = allBenchmarksCases . DistinctBy ( b => b . Descriptor . Type ) . Count ( ) > 1 ;
9094 bool hasJobBaselines = allBenchmarksCases . Any ( b => b . Job . Meta . Baseline ) ;
9195 bool hasDescriptorBaselines = allBenchmarksCases . Any ( b => b . Descriptor . Baseline ) ;
96+
97+ if ( hasMultipleTypes )
98+ {
99+ implicitRules . Add ( BenchmarkLogicalGroupRule . ByType ) ;
100+ }
92101 if ( hasJobBaselines )
93102 {
94103 implicitRules . Add ( BenchmarkLogicalGroupRule . ByParams ) ;
@@ -114,8 +123,11 @@ public string GetLogicalGroupKey(ImmutableArray<BenchmarkCase> allBenchmarksCase
114123 {
115124 switch ( rule )
116125 {
126+ case BenchmarkLogicalGroupRule . ByType :
127+ keys . Add ( benchmarkCase . Descriptor . TypeInfo ) ;
128+ break ;
117129 case BenchmarkLogicalGroupRule . ByMethod :
118- keys . Add ( benchmarkCase . Descriptor . DisplayInfo ) ;
130+ keys . Add ( benchmarkCase . Descriptor . WorkloadMethodDisplayInfo ) ;
119131 break ;
120132 case BenchmarkLogicalGroupRule . ByJob :
121133 keys . Add ( benchmarkCase . Job . DisplayInfo ) ;
@@ -139,7 +151,7 @@ public virtual IEnumerable<IGrouping<string, BenchmarkCase>> GetLogicalGroupOrde
139151 IEnumerable < IGrouping < string , BenchmarkCase > > logicalGroups ,
140152 IEnumerable < BenchmarkLogicalGroupRule > order = null )
141153 {
142- var benchmarkComparer = new BenchmarkComparer ( categoryComparer , paramsComparer , jobComparer , targetComparer , order ) ;
154+ var benchmarkComparer = new BenchmarkComparer ( categoryComparer , paramsComparer , jobComparer , typeComparer , methodComparer , order ) ;
143155 var logicalGroupComparer = new LogicalGroupComparer ( benchmarkComparer ) ;
144156 var list = logicalGroups . ToList ( ) ;
145157 list . Sort ( logicalGroupComparer ) ;
@@ -153,6 +165,7 @@ private class BenchmarkComparer : IComparer<BenchmarkCase>
153165 private static readonly BenchmarkLogicalGroupRule [ ] DefaultOrder =
154166 {
155167 BenchmarkLogicalGroupRule . ByCategory ,
168+ BenchmarkLogicalGroupRule . ByType ,
156169 BenchmarkLogicalGroupRule . ByParams ,
157170 BenchmarkLogicalGroupRule . ByJob ,
158171 BenchmarkLogicalGroupRule . ByMethod
@@ -161,18 +174,21 @@ private class BenchmarkComparer : IComparer<BenchmarkCase>
161174 private readonly IComparer < string [ ] > categoryComparer ;
162175 private readonly IComparer < ParameterInstances > paramsComparer ;
163176 private readonly IComparer < Job > jobComparer ;
164- private readonly IComparer < Descriptor > targetComparer ;
177+ private readonly IComparer < Descriptor > typeComparer ;
178+ private readonly IComparer < Descriptor > methodComparer ;
165179 private readonly List < BenchmarkLogicalGroupRule > order ;
166180
167181 public BenchmarkComparer (
168182 IComparer < string [ ] > categoryComparer ,
169183 IComparer < ParameterInstances > paramsComparer ,
170184 IComparer < Job > jobComparer ,
171- IComparer < Descriptor > targetComparer ,
185+ IComparer < Descriptor > typeComparer ,
186+ IComparer < Descriptor > methodComparer ,
172187 IEnumerable < BenchmarkLogicalGroupRule > order )
173188 {
174189 this . categoryComparer = categoryComparer ;
175- this . targetComparer = targetComparer ;
190+ this . typeComparer = typeComparer ;
191+ this . methodComparer = methodComparer ;
176192 this . jobComparer = jobComparer ;
177193 this . paramsComparer = paramsComparer ;
178194
@@ -192,7 +208,8 @@ public int Compare(BenchmarkCase x, BenchmarkCase y)
192208 {
193209 int compare = rule switch
194210 {
195- BenchmarkLogicalGroupRule . ByMethod => targetComparer ? . Compare ( x . Descriptor , y . Descriptor ) ?? 0 ,
211+ BenchmarkLogicalGroupRule . ByType => typeComparer ? . Compare ( x . Descriptor , y . Descriptor ) ?? 0 ,
212+ BenchmarkLogicalGroupRule . ByMethod => methodComparer ? . Compare ( x . Descriptor , y . Descriptor ) ?? 0 ,
196213 BenchmarkLogicalGroupRule . ByJob => jobComparer ? . Compare ( x . Job , y . Job ) ?? 0 ,
197214 BenchmarkLogicalGroupRule . ByParams => paramsComparer ? . Compare ( x . Parameters , y . Parameters ) ?? 0 ,
198215 BenchmarkLogicalGroupRule . ByCategory => categoryComparer ? . Compare ( x . Descriptor . Categories , y . Descriptor . Categories ) ?? 0 ,
0 commit comments