Skip to content

Commit ad93765

Browse files
authored
Add event processor functionality (#2420)
1 parent ece5ccf commit ad93765

File tree

11 files changed

+509
-10
lines changed

11 files changed

+509
-10
lines changed

src/BenchmarkDotNet/Configs/ConfigExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using BenchmarkDotNet.Analysers;
88
using BenchmarkDotNet.Columns;
99
using BenchmarkDotNet.Diagnosers;
10+
using BenchmarkDotNet.EventProcessors;
1011
using BenchmarkDotNet.Exporters;
1112
using BenchmarkDotNet.Filters;
1213
using BenchmarkDotNet.Jobs;
@@ -110,6 +111,7 @@ public static class ConfigExtensions
110111
[Obsolete("This method will soon be removed, please start using .AddLogicalGroupRules() instead.")]
111112
[EditorBrowsable(EditorBrowsableState.Never)] public static IConfig With(this IConfig config, params BenchmarkLogicalGroupRule[] rules) => config.AddLogicalGroupRules(rules);
112113
[PublicAPI] public static ManualConfig AddLogicalGroupRules(this IConfig config, params BenchmarkLogicalGroupRule[] rules) => config.With(c => c.AddLogicalGroupRules(rules));
114+
[PublicAPI] public static ManualConfig AddEventProcessor(this IConfig config, EventProcessor eventProcessor) => config.With(c => c.AddEventProcessor(eventProcessor));
113115

114116
[PublicAPI] public static ManualConfig HideColumns(this IConfig config, params string[] columnNames) => config.With(c => c.HideColumns(columnNames));
115117
[PublicAPI] public static ManualConfig HideColumns(this IConfig config, params IColumn[] columns) => config.With(c => c.HideColumns(columns));

src/BenchmarkDotNet/Configs/DebugConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using BenchmarkDotNet.Analysers;
55
using BenchmarkDotNet.Columns;
66
using BenchmarkDotNet.Diagnosers;
7+
using BenchmarkDotNet.EventProcessors;
78
using BenchmarkDotNet.Exporters;
89
using BenchmarkDotNet.Filters;
910
using BenchmarkDotNet.Jobs;
@@ -61,6 +62,7 @@ public abstract class DebugConfig : IConfig
6162
public IEnumerable<IDiagnoser> GetDiagnosers() => Array.Empty<IDiagnoser>();
6263
public IEnumerable<IAnalyser> GetAnalysers() => Array.Empty<IAnalyser>();
6364
public IEnumerable<HardwareCounter> GetHardwareCounters() => Array.Empty<HardwareCounter>();
65+
public IEnumerable<EventProcessor> GetEventProcessors() => Array.Empty<EventProcessor>();
6466
public IEnumerable<IFilter> GetFilters() => Array.Empty<IFilter>();
6567
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => Array.Empty<IColumnHidingRule>();
6668

src/BenchmarkDotNet/Configs/DefaultConfig.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using BenchmarkDotNet.Analysers;
66
using BenchmarkDotNet.Columns;
77
using BenchmarkDotNet.Diagnosers;
8+
using BenchmarkDotNet.EventProcessors;
89
using BenchmarkDotNet.Exporters;
910
using BenchmarkDotNet.Exporters.Csv;
1011
using BenchmarkDotNet.Filters;
@@ -108,6 +109,8 @@ public string ArtifactsPath
108109

109110
public IEnumerable<IFilter> GetFilters() => Array.Empty<IFilter>();
110111

112+
public IEnumerable<EventProcessor> GetEventProcessors() => Array.Empty<EventProcessor>();
113+
111114
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => Array.Empty<IColumnHidingRule>();
112115
}
113116
}

src/BenchmarkDotNet/Configs/IConfig.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using BenchmarkDotNet.Analysers;
55
using BenchmarkDotNet.Columns;
66
using BenchmarkDotNet.Diagnosers;
7+
using BenchmarkDotNet.EventProcessors;
78
using BenchmarkDotNet.Exporters;
89
using BenchmarkDotNet.Filters;
910
using BenchmarkDotNet.Jobs;
@@ -27,6 +28,7 @@ public interface IConfig
2728
IEnumerable<HardwareCounter> GetHardwareCounters();
2829
IEnumerable<IFilter> GetFilters();
2930
IEnumerable<BenchmarkLogicalGroupRule> GetLogicalGroupRules();
31+
IEnumerable<EventProcessor> GetEventProcessors();
3032
IEnumerable<IColumnHidingRule> GetColumnHidingRules();
3133

3234
IOrderer? Orderer { get; }

src/BenchmarkDotNet/Configs/ImmutableConfig.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using BenchmarkDotNet.Analysers;
77
using BenchmarkDotNet.Columns;
88
using BenchmarkDotNet.Diagnosers;
9+
using BenchmarkDotNet.EventProcessors;
910
using BenchmarkDotNet.Exporters;
1011
using BenchmarkDotNet.Filters;
1112
using BenchmarkDotNet.Jobs;
@@ -31,6 +32,7 @@ public sealed class ImmutableConfig : IConfig
3132
private readonly ImmutableHashSet<HardwareCounter> hardwareCounters;
3233
private readonly ImmutableHashSet<IFilter> filters;
3334
private readonly ImmutableArray<BenchmarkLogicalGroupRule> rules;
35+
private readonly ImmutableHashSet<EventProcessor> eventProcessors;
3436
private readonly ImmutableArray<IColumnHidingRule> columnHidingRules;
3537

3638
internal ImmutableConfig(
@@ -45,6 +47,7 @@ internal ImmutableConfig(
4547
ImmutableArray<BenchmarkLogicalGroupRule> uniqueRules,
4648
ImmutableArray<IColumnHidingRule> uniqueColumnHidingRules,
4749
ImmutableHashSet<Job> uniqueRunnableJobs,
50+
ImmutableHashSet<EventProcessor> uniqueEventProcessors,
4851
ConfigUnionRule unionRule,
4952
string artifactsPath,
5053
CultureInfo cultureInfo,
@@ -66,6 +69,7 @@ internal ImmutableConfig(
6669
rules = uniqueRules;
6770
columnHidingRules = uniqueColumnHidingRules;
6871
jobs = uniqueRunnableJobs;
72+
eventProcessors = uniqueEventProcessors;
6973
UnionRule = unionRule;
7074
ArtifactsPath = artifactsPath;
7175
CultureInfo = cultureInfo;
@@ -96,6 +100,7 @@ internal ImmutableConfig(
96100
public IEnumerable<HardwareCounter> GetHardwareCounters() => hardwareCounters;
97101
public IEnumerable<IFilter> GetFilters() => filters;
98102
public IEnumerable<BenchmarkLogicalGroupRule> GetLogicalGroupRules() => rules;
103+
public IEnumerable<EventProcessor> GetEventProcessors() => eventProcessors;
99104
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => columnHidingRules;
100105

101106
public ILogger GetCompositeLogger() => new CompositeLogger(loggers);

src/BenchmarkDotNet/Configs/ImmutableConfigBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public static ImmutableConfig Create(IConfig source)
5353
var uniqueHidingRules = source.GetColumnHidingRules().ToImmutableArray();
5454

5555
var uniqueRunnableJobs = GetRunnableJobs(source.GetJobs()).ToImmutableHashSet();
56+
var uniqueEventProcessors = source.GetEventProcessors().ToImmutableHashSet();
5657

5758
return new ImmutableConfig(
5859
uniqueColumnProviders,
@@ -66,6 +67,7 @@ public static ImmutableConfig Create(IConfig source)
6667
uniqueRules,
6768
uniqueHidingRules,
6869
uniqueRunnableJobs,
70+
uniqueEventProcessors,
6971
source.UnionRule,
7072
source.ArtifactsPath ?? DefaultConfig.Instance.ArtifactsPath,
7173
source.CultureInfo,

src/BenchmarkDotNet/Configs/ManualConfig.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using BenchmarkDotNet.Analysers;
77
using BenchmarkDotNet.Columns;
88
using BenchmarkDotNet.Diagnosers;
9+
using BenchmarkDotNet.EventProcessors;
910
using BenchmarkDotNet.Exporters;
1011
using BenchmarkDotNet.Extensions;
1112
using BenchmarkDotNet.Filters;
@@ -33,6 +34,7 @@ public class ManualConfig : IConfig
3334
private readonly HashSet<HardwareCounter> hardwareCounters = new HashSet<HardwareCounter>();
3435
private readonly List<IFilter> filters = new List<IFilter>();
3536
private readonly List<BenchmarkLogicalGroupRule> logicalGroupRules = new List<BenchmarkLogicalGroupRule>();
37+
private readonly List<EventProcessor> eventProcessors = new List<EventProcessor>();
3638
private readonly List<IColumnHidingRule> columnHidingRules = new List<IColumnHidingRule>();
3739

3840
public IEnumerable<IColumnProvider> GetColumnProviders() => columnProviders;
@@ -45,6 +47,7 @@ public class ManualConfig : IConfig
4547
public IEnumerable<HardwareCounter> GetHardwareCounters() => hardwareCounters;
4648
public IEnumerable<IFilter> GetFilters() => filters;
4749
public IEnumerable<BenchmarkLogicalGroupRule> GetLogicalGroupRules() => logicalGroupRules;
50+
public IEnumerable<EventProcessor> GetEventProcessors() => eventProcessors;
4851
public IEnumerable<IColumnHidingRule> GetColumnHidingRules() => columnHidingRules;
4952

5053
[PublicAPI] public ConfigOptions Options { get; set; }
@@ -221,6 +224,12 @@ public ManualConfig AddLogicalGroupRules(params BenchmarkLogicalGroupRule[] rule
221224
return this;
222225
}
223226

227+
public ManualConfig AddEventProcessor(EventProcessor eventProcessor)
228+
{
229+
this.eventProcessors.Add(eventProcessor);
230+
return this;
231+
}
232+
224233
[PublicAPI]
225234
public ManualConfig HideColumns(params string[] columnNames)
226235
{
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using BenchmarkDotNet.Extensions;
4+
using BenchmarkDotNet.Reports;
5+
using BenchmarkDotNet.Running;
6+
using BenchmarkDotNet.Toolchains.Results;
7+
using BenchmarkDotNet.Validators;
8+
9+
namespace BenchmarkDotNet.EventProcessors
10+
{
11+
internal sealed class CompositeEventProcessor : EventProcessor
12+
{
13+
private readonly HashSet<EventProcessor> eventProcessors;
14+
15+
public CompositeEventProcessor(BenchmarkRunInfo[] benchmarkRunInfos)
16+
{
17+
var eventProcessors = new HashSet<EventProcessor>();
18+
19+
foreach (var info in benchmarkRunInfos)
20+
eventProcessors.AddRange(info.Config.GetEventProcessors());
21+
22+
this.eventProcessors = eventProcessors;
23+
}
24+
25+
public override void OnStartValidationStage()
26+
{
27+
foreach (var eventProcessor in eventProcessors)
28+
eventProcessor.OnStartValidationStage();
29+
}
30+
31+
public override void OnValidationError(ValidationError validationError)
32+
{
33+
foreach (var eventProcessor in eventProcessors)
34+
eventProcessor.OnValidationError(validationError);
35+
}
36+
37+
public override void OnEndValidationStage()
38+
{
39+
foreach (var eventProcessor in eventProcessors)
40+
eventProcessor.OnEndValidationStage();
41+
}
42+
43+
public override void OnStartBuildStage(IReadOnlyList<BuildPartition> partitions)
44+
{
45+
foreach (var eventProcessor in eventProcessors)
46+
eventProcessor.OnStartBuildStage(partitions);
47+
}
48+
49+
public override void OnBuildComplete(BuildPartition buildPartition, BuildResult buildResult)
50+
{
51+
foreach (var eventProcessor in eventProcessors)
52+
eventProcessor.OnBuildComplete(buildPartition, buildResult);
53+
}
54+
55+
public override void OnEndBuildStage()
56+
{
57+
foreach (var eventProcessor in eventProcessors)
58+
eventProcessor.OnEndBuildStage();
59+
}
60+
61+
public override void OnStartRunStage()
62+
{
63+
foreach (var eventProcessor in eventProcessors)
64+
eventProcessor.OnStartRunStage();
65+
}
66+
67+
public override void OnEndRunStage()
68+
{
69+
foreach (var eventProcessor in eventProcessors)
70+
eventProcessor.OnEndRunStage();
71+
}
72+
73+
public override void OnStartRunBenchmarksInType(Type type, IReadOnlyList<BenchmarkCase> benchmarks)
74+
{
75+
foreach (var eventProcessor in eventProcessors)
76+
eventProcessor.OnStartRunBenchmarksInType(type, benchmarks);
77+
}
78+
79+
public override void OnEndRunBenchmarksInType(Type type, Summary summary)
80+
{
81+
foreach (var eventProcessor in eventProcessors)
82+
eventProcessor.OnEndRunBenchmarksInType(type, summary);
83+
}
84+
85+
public override void OnEndRunBenchmark(BenchmarkCase benchmarkCase, BenchmarkReport report)
86+
{
87+
foreach (var eventProcessor in eventProcessors)
88+
eventProcessor.OnEndRunBenchmark(benchmarkCase, report);
89+
}
90+
91+
public override void OnStartRunBenchmark(BenchmarkCase benchmarkCase)
92+
{
93+
foreach (var eventProcessor in eventProcessors)
94+
eventProcessor.OnStartRunBenchmark(benchmarkCase);
95+
}
96+
}
97+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using BenchmarkDotNet.Reports;
4+
using BenchmarkDotNet.Running;
5+
using BenchmarkDotNet.Toolchains.Results;
6+
using BenchmarkDotNet.Validators;
7+
8+
namespace BenchmarkDotNet.EventProcessors
9+
{
10+
public abstract class EventProcessor
11+
{
12+
public virtual void OnStartValidationStage() { }
13+
public virtual void OnValidationError(ValidationError validationError) { }
14+
public virtual void OnEndValidationStage() { }
15+
public virtual void OnStartBuildStage(IReadOnlyList<BuildPartition> partitions) { }
16+
public virtual void OnBuildComplete(BuildPartition partition, BuildResult buildResult) { }
17+
public virtual void OnEndBuildStage() { }
18+
public virtual void OnStartRunStage() { }
19+
public virtual void OnStartRunBenchmarksInType(Type type, IReadOnlyList<BenchmarkCase> benchmarks) { }
20+
public virtual void OnEndRunBenchmarksInType(Type type, Summary summary) { }
21+
public virtual void OnStartRunBenchmark(BenchmarkCase benchmarkCase) { }
22+
public virtual void OnEndRunBenchmark(BenchmarkCase benchmarkCase, BenchmarkReport report) { }
23+
public virtual void OnEndRunStage() { }
24+
}
25+
}

0 commit comments

Comments
 (0)