GFramework/GFramework.Cqrs.Benchmarks
gewuyou b0102b5206 test(cqrs): 补充 notification publisher fan-out 基准对照
- 新增默认顺序发布器与 TaskWhenAllNotificationPublisher 的 fixed 4 handler fan-out benchmark 对照

- 更新 benchmark README 与 cqrs-rewrite 恢复文档,记录 RP-114 的性能结论与下一步
2026-05-08 17:42:48 +08:00
..

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
    • InitializationColdStart 两组 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 完整枚举对比

最小使用方式

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 / 建流对比继续扩展到更多场景