forked from zarusz/SlimMessageBus
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReqRespBenchmark.cs
More file actions
153 lines (126 loc) · 5.14 KB
/
ReqRespBenchmark.cs
File metadata and controls
153 lines (126 loc) · 5.14 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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
namespace SlimMessageBus.Host.Memory.Benchmark;
using BenchmarkDotNet.Attributes;
using Microsoft.Extensions.DependencyInjection;
using SlimMessageBus.Host.Interceptor;
public abstract class ReqRespBaseBenchmark : AbstractMemoryBenchmark
{
protected override void Setup(ServiceCollection services)
{
services.AddSingleton<TestResult>();
services.AddTransient<SomeRequestHandler>();
}
public async Task RunTest(int messageCount, bool createMessageScope)
{
PerMessageScopeEnabled = createMessageScope;
var bus = Bus;
var sendRequests = Enumerable.Range(0, messageCount).Select(x => bus.Send(new SomeRequest(DateTimeOffset.Now, x)));
await Task.WhenAll(sendRequests);
var testResult = ServiceProvider.GetRequiredService<TestResult>();
while (testResult.ArrivedCount < messageCount)
{
await Task.Yield();
}
}
}
[MemoryDiagnoser]
public class ReqRespBenchmark : ReqRespBaseBenchmark
{
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task RequestResponse(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class ReqRespWithProducerInterceptorBenchmark : ReqRespBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<IProducerInterceptor<SomeRequest>, SomeRequestProducerInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task ReqRespWithProducerInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class ReqRespWithSendInterceptorBenchmark : ReqRespBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<ISendInterceptor<SomeRequest, SomeResponse>, SomeRequestSendInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task ReqRespWithSendInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class ReqRespWithConsumerInterceptorBenchmark : ReqRespBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<IConsumerInterceptor<SomeRequest>, SomeRequestConsumerInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task ReqRespWithConsumerInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
[MemoryDiagnoser]
public class ReqRespWithRequestHandlerInterceptorBenchmark : ReqRespBaseBenchmark
{
protected override void Setup(ServiceCollection services)
{
base.Setup(services);
services.AddTransient<IRequestHandlerInterceptor<SomeRequest, SomeResponse>, SomeRequestHandlerInterceptor>();
}
[Benchmark]
[Arguments(1000000, true)]
[Arguments(1000000, false)]
public Task ReqRespWithRequestHandlerInterceptor(int messageCount, bool createMessageScope) => RunTest(messageCount, createMessageScope);
}
public record SomeRequest(DateTimeOffset Timestamp, long Id) : IRequest<SomeResponse>;
public record SomeResponse(DateTimeOffset Timestamp, long Id);
public record SomeRequestHandler(TestResult TestResult) : IRequestHandler<SomeRequest, SomeResponse>
{
public Task<SomeResponse> OnHandle(SomeRequest request, CancellationToken cancellationToken)
{
TestResult.OnArrived();
return Task.FromResult(new SomeResponse(DateTimeOffset.Now, request.Id));
}
}
public record SomeRequestProducerInterceptor : IProducerInterceptor<SomeRequest>
{
public Task<object> OnHandle(SomeRequest message, Func<Task<object>> next, IProducerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}
public record SomeRequestSendInterceptor : ISendInterceptor<SomeRequest, SomeResponse>
{
public Task<SomeResponse> OnHandle(SomeRequest message, Func<Task<SomeResponse>> next, IProducerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}
public record SomeRequestConsumerInterceptor : IConsumerInterceptor<SomeRequest>
{
public Task<object> OnHandle(SomeRequest message, Func<Task<object>> next, IConsumerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}
public record SomeRequestHandlerInterceptor : IRequestHandlerInterceptor<SomeRequest, SomeResponse>
{
public Task<SomeResponse> OnHandle(SomeRequest message, Func<Task<SomeResponse>> next, IConsumerContext context)
{
// We return immediately as we want to calculate the interceptor pipeline overhead
return next();
}
}