Performance
Foundatio.Mediator aims to get as close to direct method call performance as possible while providing a full-featured mediator with excellent developer ergonomics. Through C# interceptors and source generators, we eliminate runtime reflection entirely.
Benchmark Results
📊 Last Updated: 2026-02-23
Commands
Process a message with no return value.
| Method | Mean | Allocated |
|---|---|---|
Direct_Command | 0.0000 ns | 0 B |
Foundatio_Command | 0.0584 ns | 0 B |
MediatorNet_Command | 8.4553 ns | 0 B |
ImmediateHandlers_Command | 11.0105 ns | 0 B |
MediatR_Command | 32.3613 ns | 128 B |
Wolverine_Command | 176.5181 ns | 704 B |
MassTransit_Command | 1,826.2737 ns | 4,912 B |
Queries
Request/response dispatch returning an Order object.
| Method | Mean | Allocated |
|---|---|---|
Direct_Query | 21.1054 ns | 48 B |
Foundatio_Query | 22.7625 ns | 48 B |
MediatorNet_Query | 25.0262 ns | 48 B |
ImmediateHandlers_Query | 29.5762 ns | 48 B |
MediatR_Query | 53.4603 ns | 248 B |
MediatR_QueryWithDependencies | 124.3021 ns | 600 B |
Wolverine_Query | 241.9654 ns | 864 B |
MassTransit_Query | 6,067.4272 ns | 13,144 B |
Events (Publish)
Notification dispatched to 2 handlers.
| Method | Mean | Allocated |
|---|---|---|
Direct_Publish | 0.0052 ns | 0 B |
MediatorNet_Publish | 5.6175 ns | 0 B |
Foundatio_Publish | 16.2971 ns | 0 B |
ImmediateHandlers_Publish | 51.8625 ns | 32 B |
MediatR_Publish | 52.5791 ns | 440 B |
Wolverine_Publish | 1,755.3777 ns | 2,840 B |
MassTransit_Publish | 2,951.8865 ns | 7,456 B |
Full Query (Dependencies + Middleware)
Query where handler has an injected service (IOrderService) and timing middleware (Before/Finally or IPipelineBehavior).
| Method | Mean | Allocated |
|---|---|---|
Direct_FullQuery | 62.9251 ns | 160 B |
MediatorNet_FullQuery | 73.6510 ns | 88 B |
ImmediateHandlers_FullQuery | 74.1282 ns | 88 B |
Foundatio_FullQuery | 77.3365 ns | 88 B |
Wolverine_FullQuery | 284.2368 ns | 944 B |
MassTransit_FullQuery | 5,914.7751 ns | 13,144 B |
Cascading Messages
CreateOrder returns an Order and publishes OrderCreatedEvent to 2 handlers. Foundatio uses tuple returns for automatic cascading; other libraries publish manually.
| Method | Mean | Allocated |
|---|---|---|
Direct_CascadingMessages | 26.9792 ns | 144 B |
MediatorNet_CascadingMessages | 36.7020 ns | 72 B |
Foundatio_CascadingMessages | 53.6296 ns | 72 B |
ImmediateHandlers_CascadingMessages | 82.9136 ns | 104 B |
MediatR_CascadingMessages | 113.6711 ns | 744 B |
Wolverine_CascadingMessages | 2,220.3872 ns | 4,056 B |
MassTransit_CascadingMessages | 8,388.0615 ns | 20,848 B |
Short-Circuit Middleware
Middleware returns cached result; handler is never invoked. Each library uses its idiomatic short-circuit approach (IPipelineBehavior, HandlerResult.ShortCircuit, HandlerContinuation.Stop, etc.).
| Method | Mean | Allocated |
|---|---|---|
Direct_ShortCircuit | 0.2052 ns | 0 B |
Foundatio_ShortCircuit | 5.1399 ns | 0 B |
MediatorNet_ShortCircuit | 8.2942 ns | 0 B |
ImmediateHandlers_ShortCircuit | 9.0116 ns | 0 B |
MediatR_ShortCircuit | 48.3730 ns | 416 B |
Wolverine_ShortCircuit | 203.9298 ns | 824 B |
MassTransit_ShortCircuit | 5,525.8000 ns | 12,224 B |
Running Benchmarks Locally
cd benchmarks/Foundatio.Mediator.Benchmarks
dotnet run -c Release