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-01-09
Commands
Fire-and-forget dispatch with no return value.
| Method | Mean | Allocated |
|---|---|---|
Direct_Command | 0.0018 ns | 0 B |
Foundatio_Command | 7.7535 ns | 0 B |
MediatorNet_Command | 8.7615 ns | 0 B |
ImmediateHandlers_Command | 11.5821 ns | 0 B |
MediatR_Command | 34.8951 ns | 128 B |
Wolverine_Command | 191.5925 ns | 704 B |
MassTransit_Command | 1,894.2028 ns | 4,912 B |
Queries
Request/response dispatch returning an Order object.
| Method | Mean | Allocated |
|---|---|---|
Direct_Query | 21.4985 ns | 48 B |
MediatorNet_Query | 25.9325 ns | 48 B |
Foundatio_Query | 29.4850 ns | 48 B |
ImmediateHandlers_Query | 31.3242 ns | 48 B |
MediatR_Query | 54.1867 ns | 248 B |
MediatR_QueryWithDependencies | 134.4035 ns | 600 B |
Wolverine_Query | 270.7645 ns | 864 B |
MassTransit_Query | 6,860.7615 ns | 13,144 B |
Events (Publish)
Notification dispatched to 2 handlers.
| Method | Mean | Allocated |
|---|---|---|
Direct_Publish | 0.0046 ns | 0 B |
MediatorNet_Publish | 6.2083 ns | 0 B |
Foundatio_Publish | 29.6835 ns | 0 B |
ImmediateHandlers_Publish | 54.4492 ns | 32 B |
MediatR_Publish | 56.4874 ns | 440 B |
Wolverine_Publish | 1,858.9299 ns | 2,840 B |
MassTransit_Publish | 3,019.7545 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 | 64.3040 ns | 160 B |
MediatorNet_FullQuery | 76.7475 ns | 88 B |
ImmediateHandlers_FullQuery | 76.9550 ns | 88 B |
Foundatio_FullQuery | 125.0594 ns | 288 B |
Wolverine_FullQuery | 310.9703 ns | 944 B |
MassTransit_FullQuery | 6,984.8064 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 | 27.9258 ns | 144 B |
MediatorNet_CascadingMessages | 37.5463 ns | 72 B |
Foundatio_CascadingMessages | 76.1077 ns | 72 B |
ImmediateHandlers_CascadingMessages | 84.0305 ns | 104 B |
MediatR_CascadingMessages | 117.5655 ns | 744 B |
Wolverine_CascadingMessages | 2,283.9439 ns | 4,056 B |
MassTransit_CascadingMessages | 9,479.0192 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.2548 ns | 0 B |
MediatorNet_ShortCircuit | 8.5877 ns | 0 B |
ImmediateHandlers_ShortCircuit | 9.6720 ns | 0 B |
Foundatio_ShortCircuit | 9.7259 ns | 0 B |
MediatR_ShortCircuit | 51.7768 ns | 416 B |
Wolverine_ShortCircuit | 230.5081 ns | 824 B |
MassTransit_ShortCircuit | 6,363.0741 ns | 12,224 B |
Running Benchmarks Locally
cd benchmarks/Foundatio.Mediator.Benchmarks
dotnet run -c Release