Skip to content

Commit 3bddeb4

Browse files
Update documentation
1 parent 7432bad commit 3bddeb4

4 files changed

Lines changed: 72 additions & 36 deletions

File tree

benchmarks/Benchmark.Behaviors/Benchmark.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ CancellationToken cancellationToken
135135
) => await service.ServiceHandler(request, cancellationToken);
136136
}
137137

138+
[SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.Net90)]
139+
[SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.Net10_0)]
138140
[MemoryDiagnoser]
139141
[Orderer(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared)]
140142
[RankColumn]

benchmarks/Benchmark.Large/Benchmark.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ CancellationToken token
6161
) => ValueTask.FromResult(s_response);
6262
}
6363

64+
[SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.Net90)]
65+
[SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.Net10_0)]
6466
[MemoryDiagnoser]
6567
[Orderer(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared)]
6668
[RankColumn]

benchmarks/Benchmark.Simple/Benchmark.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ CancellationToken token
6161
) => ValueTask.FromResult(s_response);
6262
}
6363

64+
[SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.Net90)]
65+
[SimpleJob(BenchmarkDotNet.Jobs.RuntimeMoniker.Net10_0)]
6466
[MemoryDiagnoser]
6567
[Orderer(SummaryOrderPolicy.FastestToSlowest, MethodOrderPolicy.Declared)]
6668
[RankColumn]

readme.md

Lines changed: 66 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,14 @@ Create a Handler by adding the following code:
3434

3535
```cs
3636
[Handler]
37-
public static partial class GetUsersQuery
37+
public sealed partial class GetUsersQuery(
38+
UsersService usersService
39+
)
3840
{
3941
public record Query;
4042

41-
private static ValueTask<IEnumerable<User>> HandleAsync(
43+
private ValueTask<IEnumerable<User>> HandleAsync(
4244
Query _,
43-
UsersService usersService,
4445
CancellationToken token
4546
)
4647
{
@@ -69,13 +70,14 @@ For Command handlers, use a `ValueTask`, and Immediate.Handlers will insert a re
6970
of `ValueTuple` to your handler automatically.
7071
```cs
7172
[Handler]
72-
public static partial class CreateUserCommand
73+
public sealed partial class CreateUserCommand()
74+
UsersService usersService
75+
)
7376
{
7477
public record Command(string Email);
7578

76-
private static async ValueTask HandleAsync(
79+
private async ValueTask HandleAsync(
7780
Command command,
78-
UsersService usersService,
7981
CancellationToken token
8082
)
8183
{
@@ -149,7 +151,7 @@ public sealed class DefaultBehaviorsAttribute : Attribute;
149151
// usage
150152
[Handler]
151153
[DefaultBehaviors]
152-
public static class GetUsersQuery
154+
public sealed class GetUsersQuery
153155
{
154156
// ..
155157
}
@@ -217,48 +219,76 @@ All performance benchmarks reported use the following environment:
217219
```
218220
// * Summary *
219221
220-
BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.4317/23H2/2023Update/SunValley3)
221-
12th Gen Intel Core i7-12700H, 1 CPU, 20 logical and 14 physical cores
222-
.NET SDK 9.0.100
223-
[Host] : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2
224-
DefaultJob : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2
222+
BenchmarkDotNet v0.15.2, Windows 11 (10.0.26100.4946/24H2/2024Update/HudsonValley)
223+
12th Gen Intel Core i7-12700H 2.30GHz, 1 CPU, 20 logical and 14 physical cores
224+
.NET SDK 10.0.100-preview.6.25358.103
225+
[Host] : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
226+
.NET 10.0 : .NET 10.0.0 (10.0.25.35903), X64 RyuJIT AVX2
227+
.NET 9.0 : .NET 9.0.8 (9.0.825.36511), X64 RyuJIT AVX2
225228
```
226229

227230
#### [Benchmarks.Simple](./benchmarks/Benchmark.Simple)
228231

229232
This benchmark tests the various mediator implementations with a single request/response handler.
230233

231-
| Method | Mean | Error | Ratio | Rank | Allocated |
232-
|----------------------------- |-----------:|----------:|------:|-----:|----------:|
233-
| SendRequest_Baseline | 0.6618 ns | 0.0127 ns | 1.00 | 1 | - |
234-
| SendRequest_IHandler | 14.0497 ns | 0.0753 ns | 21.23 | 2 | - |
235-
| SendRequest_ImmediateHandler | 14.9493 ns | 0.0818 ns | 22.59 | 3 | - |
236-
| SendRequest_Mediator | 22.0218 ns | 0.0684 ns | 33.28 | 4 | - |
237-
| SendRequest_IMediator | 26.8625 ns | 0.1428 ns | 40.60 | 5 | - |
238-
| SendRequest_MediatR | 47.5135 ns | 0.4161 ns | 71.81 | 6 | 192 B |
234+
| Method | Runtime | Mean | Error | Ratio | Rank | Allocated |
235+
|----------------------------------------- |---------- |-----------:|----------:|------:|-----:|----------:|
236+
| SendRequest_Baseline | .NET 10.0 | 0.6939 ns | 0.0156 ns | 1.00 | 1 | - |
237+
| SendRequest_ImmediateStaticHandler | .NET 10.0 | 10.7934 ns | 0.1006 ns | 15.56 | 2 | - |
238+
| SendRequest_ImmediateHandler_Abstraction | .NET 10.0 | 11.1127 ns | 0.2450 ns | 16.02 | 2 | - |
239+
| SendRequest_ImmediateSealedHandler | .NET 10.0 | 11.7686 ns | 0.0473 ns | 16.97 | 2 | - |
240+
| SendRequest_Mediator | .NET 10.0 | 22.7844 ns | 0.0959 ns | 32.85 | 3 | - |
241+
| SendRequest_IMediator | .NET 10.0 | 25.8943 ns | 0.0659 ns | 37.33 | 4 | - |
242+
| SendRequest_MediatR | .NET 10.0 | 42.2888 ns | 0.8504 ns | 60.97 | 5 | 200 B |
243+
| | | | | | | |
244+
| SendRequest_Baseline | .NET 9.0 | 0.7045 ns | 0.0546 ns | 1.01 | 1 | - |
245+
| SendRequest_ImmediateStaticHandler | .NET 9.0 | 11.1561 ns | 0.0695 ns | 15.94 | 2 | - |
246+
| SendRequest_ImmediateSealedHandler | .NET 9.0 | 11.1793 ns | 0.0624 ns | 15.97 | 2 | - |
247+
| SendRequest_ImmediateHandler_Abstraction | .NET 9.0 | 14.2575 ns | 0.0685 ns | 20.37 | 3 | - |
248+
| SendRequest_Mediator | .NET 9.0 | 22.5723 ns | 0.1380 ns | 32.25 | 4 | - |
249+
| SendRequest_IMediator | .NET 9.0 | 29.5758 ns | 0.6365 ns | 42.26 | 5 | - |
250+
| SendRequest_MediatR | .NET 9.0 | 51.0341 ns | 1.0445 ns | 72.92 | 6 | 264 B |
239251

240252
#### [Benchmarks.Large](./benchmarks/Benchmark.Large)
241253

242254
This benchmark tests the various mediator implementations in the face of 999 request/response handlers.
243255

244-
| Method | Mean | Error | Ratio | Rank | Allocated |
245-
|----------------------------- |------------:|----------:|-------:|-----:|----------:|
246-
| SendRequest_Baseline | 0.6257 ns | 0.0202 ns | 1.00 | 1 | - |
247-
| SendRequest_ImmediateHandler | 11.2358 ns | 0.0395 ns | 17.97 | 2 | - |
248-
| SendRequest_IHandler | 14.0575 ns | 0.0652 ns | 22.49 | 3 | - |
249-
| SendRequest_Mediator | 22.0874 ns | 0.0534 ns | 35.33 | 4 | - |
250-
| SendRequest_MediatR | 48.3577 ns | 0.2402 ns | 77.35 | 5 | 192 B |
251-
| SendRequest_IMediator | 420.2067 ns | 4.5092 ns | 672.17 | 6 | - |
256+
| Method | Runtime | Mean | Error | Ratio | Rank | Allocated |
257+
|----------------------------------------- |---------- |------------:|----------:|-------:|-----:|----------:|
258+
| SendRequest_Baseline | .NET 10.0 | 0.5540 ns | 0.0175 ns | 1.00 | 1 | - |
259+
| SendRequest_ImmediateSealedHandler | .NET 10.0 | 11.1447 ns | 0.0632 ns | 20.13 | 2 | - |
260+
| SendRequest_ImmediateHandler_Abstraction | .NET 10.0 | 11.8685 ns | 0.0499 ns | 21.44 | 3 | - |
261+
| SendRequest_ImmediateStaticHandler | .NET 10.0 | 12.7938 ns | 0.0772 ns | 23.11 | 4 | - |
262+
| SendRequest_Mediator | .NET 10.0 | 22.6308 ns | 0.0894 ns | 40.89 | 5 | - |
263+
| SendRequest_MediatR | .NET 10.0 | 42.3911 ns | 0.3226 ns | 76.59 | 6 | 200 B |
264+
| SendRequest_IMediator | .NET 10.0 | 423.9941 ns | 2.0621 ns | 766.00 | 7 | - |
265+
| | | | | | | |
266+
| SendRequest_Baseline | .NET 9.0 | 0.9383 ns | 0.0184 ns | 1.00 | 1 | - |
267+
| SendRequest_ImmediateSealedHandler | .NET 9.0 | 11.1246 ns | 0.0463 ns | 11.86 | 2 | - |
268+
| SendRequest_ImmediateStaticHandler | .NET 9.0 | 11.1377 ns | 0.0969 ns | 11.87 | 2 | - |
269+
| SendRequest_ImmediateHandler_Abstraction | .NET 9.0 | 14.0591 ns | 0.0555 ns | 14.99 | 3 | - |
270+
| SendRequest_Mediator | .NET 9.0 | 22.3005 ns | 0.0420 ns | 23.77 | 4 | - |
271+
| SendRequest_MediatR | .NET 9.0 | 49.7489 ns | 0.3809 ns | 53.03 | 5 | 264 B |
272+
| SendRequest_IMediator | .NET 9.0 | 442.8573 ns | 4.3888 ns | 472.08 | 6 | - |
252273

253274
#### [Benchmarks.Behaviors](./benchmarks/Benchmark.Behaviors)
254275

255276
This benchmark tests a more realistic scenario of using 1 behavior and 1 service.
256277

257-
| Method | Mean | Error | Ratio | Rank | Allocated |
258-
|----------------------------- |----------:|---------:|------:|-----:|----------:|
259-
| SendRequest_Baseline | 47.83 ns | 0.160 ns | 1.00 | 1 | 40 B |
260-
| SendRequest_ImmediateHandler | 62.67 ns | 0.350 ns | 1.31 | 2 | 40 B |
261-
| SendRequest_IHandler | 63.59 ns | 0.218 ns | 1.33 | 2 | 40 B |
262-
| SendRequest_Mediator | 91.53 ns | 0.292 ns | 1.91 | 3 | 40 B |
263-
| SendRequest_IMediator | 100.73 ns | 0.396 ns | 2.11 | 4 | 40 B |
264-
| SendRequest_MediatR | 188.54 ns | 0.785 ns | 3.94 | 5 | 560 B |
278+
| Method | Runtime | Mean | Error | Ratio | Rank | Allocated |
279+
|----------------------------------------- |---------- |----------:|---------:|------:|-----:|----------:|
280+
| SendRequest_Baseline | .NET 10.0 | 45.77 ns | 0.696 ns | 1.00 | 1 | 40 B |
281+
| SendRequest_ImmediateSealedHandler | .NET 10.0 | 58.53 ns | 0.369 ns | 1.28 | 2 | 40 B |
282+
| SendRequest_ImmediateHandler_Abstraction | .NET 10.0 | 58.55 ns | 0.322 ns | 1.28 | 2 | 40 B |
283+
| SendRequest_ImmediateStaticHandler | .NET 10.0 | 59.56 ns | 1.148 ns | 1.30 | 2 | 40 B |
284+
| SendRequest_Mediator | .NET 10.0 | 89.50 ns | 0.430 ns | 1.96 | 3 | 40 B |
285+
| SendRequest_IMediator | .NET 10.0 | 92.54 ns | 0.493 ns | 2.02 | 4 | 40 B |
286+
| SendRequest_MediatR | .NET 10.0 | 186.40 ns | 1.175 ns | 4.07 | 5 | 496 B |
287+
| | | | | | | |
288+
| SendRequest_Baseline | .NET 9.0 | 48.00 ns | 0.352 ns | 1.00 | 1 | 40 B |
289+
| SendRequest_ImmediateStaticHandler | .NET 9.0 | 61.62 ns | 0.536 ns | 1.28 | 2 | 40 B |
290+
| SendRequest_ImmediateSealedHandler | .NET 9.0 | 62.75 ns | 0.533 ns | 1.31 | 2 | 40 B |
291+
| SendRequest_ImmediateHandler_Abstraction | .NET 9.0 | 64.75 ns | 0.608 ns | 1.35 | 2 | 40 B |
292+
| SendRequest_Mediator | .NET 9.0 | 91.79 ns | 0.455 ns | 1.91 | 3 | 40 B |
293+
| SendRequest_IMediator | .NET 9.0 | 101.97 ns | 0.291 ns | 2.12 | 4 | 40 B |
294+
| SendRequest_MediatR | .NET 9.0 | 195.75 ns | 3.187 ns | 4.08 | 5 | 560 B |

0 commit comments

Comments
 (0)