forked from zarusz/SlimMessageBus
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPubSubBenchmark.cs
More file actions
126 lines (104 loc) · 3.98 KB
/
PubSubBenchmark.cs
File metadata and controls
126 lines (104 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
namespace SlimMessageBus.Host.Memory.Benchmark;
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using SlimMessageBus.Host.Interceptor;
public abstract class PubSubBaseBenchmark : AbstractMemoryBenchmark
{
protected override void Setup(ServiceCollection services)
{
services.AddSingleton<TestResult>();
services.AddTransient<SomeEventConsumer>();
}
protected async Task RunTest(int messageCount, bool createMessageScope)
{
PerMessageScopeEnabled = createMessageScope;
var bus = Bus;
var publishTasks = Enumerable.Range(0, messageCount).Select(x => bus.Publish(new SomeEvent(DateTimeOffset.Now, x)));
await Task.WhenAll(publishTasks);
var testResult = ServiceProvider.GetRequiredService<TestResult>();
while (testResult.ArrivedCount < messageCount)
{
await Task.Yield();
}
}
}
[MemoryDiagnoser]
public class PubSubBenchmark : PubSubBaseBenchmark
{
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task PubSub(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class PubSubWithProducerInterceptorBenchmark : PubSubBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<IProducerInterceptor<SomeEvent>, SomeEventProducerInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task PubSubWithProducerInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class PubSubWithPublishInterceptorBenchmark : PubSubBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<IPublishInterceptor<SomeEvent>, SomeEventPublishInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task PubSubWithPublishInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class PubSubWithConsumerInterceptorBenchmark : PubSubBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<IConsumerInterceptor<SomeEvent>, SomeEventConsumerInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task PubSubWithConsumerInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
public record SomeEvent(DateTimeOffset Timestamp, long Id);
public record SomeEventConsumer(TestResult TestResult) : IConsumer<SomeEvent>
{
public Task OnHandle(SomeEvent message, CancellationToken cancellationToken)
{
TestResult.OnArrived();
return Task.CompletedTask;
}
}
public record SomeEventProducerInterceptor : IProducerInterceptor<SomeEvent>
{
public Task<object> OnHandle(SomeEvent message, Func<Task<object>> next, IProducerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}
public record SomeEventPublishInterceptor : IPublishInterceptor<SomeEvent>
{
public Task OnHandle(SomeEvent message, Func<Task> next, IProducerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}
public record SomeEventConsumerInterceptor : IConsumerInterceptor<SomeEvent>
{
public Task<object> OnHandle(SomeEvent message, Func<Task<object>> next, IConsumerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}