mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-09 10:19:00 +08:00
- 新增默认顺序发布器与 TaskWhenAllNotificationPublisher 的 fixed 4 handler fan-out benchmark 对照 - 更新 benchmark README 与 cqrs-rewrite 恢复文档,记录 RP-114 的性能结论与下一步
60 lines
3.8 KiB
Markdown
60 lines
3.8 KiB
Markdown
# GFramework.Cqrs.Benchmarks
|
||
|
||
该模块承载 `GFramework.Cqrs` 的独立性能基准工程,用于持续比较运行时 dispatch、publish、cold-start 与后续 generator / pipeline 收口的成本变化。
|
||
|
||
## 目的
|
||
|
||
- 为 `GFramework.Cqrs` 建立独立于 NUnit 集成测试的 BenchmarkDotNet 基线
|
||
- 参考 `ai-libs/Mediator/benchmarks` 的场景组织方式,逐步补齐 request、notification、stream 与初始化成本对比
|
||
- 为后续吸收 `Mediator` 的 dispatch 设计、fixture 组织和对比矩阵提供可重复验证入口
|
||
|
||
## 当前内容
|
||
|
||
- `Program.cs`
|
||
- benchmark 命令行入口
|
||
- `Messaging/Fixture.cs`
|
||
- 运行前输出并校验场景配置
|
||
- `Messaging/RequestBenchmarks.cs`
|
||
- direct handler、NuGet `Mediator` source-generated concrete path、已接上 handwritten generated request invoker provider 的默认 `GFramework.Cqrs` runtime 与 `MediatR` 的 request steady-state dispatch 对比
|
||
- `Messaging/RequestLifetimeBenchmarks.cs`
|
||
- `Singleton / Transient` 两类 handler 生命周期下,direct handler、`GFramework.Cqrs` runtime 与 `MediatR` 的 request steady-state dispatch 对比
|
||
- `Messaging/StreamLifetimeBenchmarks.cs`
|
||
- `Singleton / Transient` 两类 handler 生命周期下,direct handler、已接上 handwritten generated stream invoker provider 的 `GFramework.Cqrs` runtime 与 `MediatR` 的 stream 完整枚举对比
|
||
- `Messaging/RequestPipelineBenchmarks.cs`
|
||
- `0 / 1 / 4` 个 pipeline 行为下,direct handler、已接上 handwritten generated request invoker provider 的 `GFramework.Cqrs` runtime 与 `MediatR` 的 request steady-state dispatch 对比
|
||
- `Messaging/RequestStartupBenchmarks.cs`
|
||
- `Initialization` 与 `ColdStart` 两组 request startup 成本对比,补齐与 `Mediator` comparison benchmark 更接近的 startup 维度
|
||
- `Messaging/RequestInvokerBenchmarks.cs`
|
||
- direct handler、`GFramework.Cqrs` reflection runtime、handwritten generated-invoker runtime 与 `MediatR` 的 request steady-state dispatch 对比
|
||
- `Messaging/StreamInvokerBenchmarks.cs`
|
||
- direct handler、`GFramework.Cqrs` reflection runtime、handwritten generated-invoker runtime 与 `MediatR` 的 stream 完整枚举对比
|
||
- `Messaging/NotificationBenchmarks.cs`
|
||
- `GFramework.Cqrs` runtime、NuGet `Mediator` source-generated concrete path 与 `MediatR` 的单处理器 notification publish 对比
|
||
- `Messaging/NotificationFanOutBenchmarks.cs`
|
||
- fixed `4 handler` notification fan-out 的 baseline、`GFramework.Cqrs` 默认顺序发布器、内置 `TaskWhenAllNotificationPublisher`、NuGet `Mediator` source-generated concrete path 与 `MediatR` publish 对比
|
||
- `Messaging/StreamingBenchmarks.cs`
|
||
- direct handler、已接上 handwritten generated stream invoker provider 的 `GFramework.Cqrs` runtime 与 `MediatR` 的 stream request 完整枚举对比
|
||
|
||
## 最小使用方式
|
||
|
||
```bash
|
||
dotnet run --project GFramework.Cqrs.Benchmarks/GFramework.Cqrs.Benchmarks.csproj -c Release
|
||
```
|
||
|
||
也可以通过 `BenchmarkDotNet` 过滤器只运行某一类场景。
|
||
|
||
## 当前约束
|
||
|
||
- `BenchmarkDotNet.Artifacts/` 属于本地生成输出,默认加入仓库忽略,不作为常规提交内容
|
||
- 只要变更影响 `GFramework.Cqrs` request dispatch、DI 解析热路径、invoker/provider、pipeline 或 benchmark 宿主,就必须至少复跑:
|
||
- `RequestBenchmarks.SendRequest_*`
|
||
- `RequestLifetimeBenchmarks.SendRequest_*`
|
||
- 当前性能目标不是超过 source-generated `Mediator`,而是让默认 request steady-state 路径尽量接近它,并至少稳定快于基于反射 / 扫描的 `MediatR`
|
||
|
||
## 后续扩展方向
|
||
|
||
- request / stream 的真实 source-generator 产物与 handwritten generated provider 对照
|
||
- `Mediator` 的 transient / scoped compile-time lifetime 矩阵对照
|
||
- 带真实显式作用域边界的 scoped host 对照
|
||
- generated invoker provider 与纯反射 dispatch / 建流对比继续扩展到更多场景
|