跳转至

Gort 性能基线文档

生成日期: 2026-03-31
测试环境: - OS: macOS (darwin) - Arch: amd64 - CPU: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz - Go: 1.23.0


概述

本文档记录了 gort 项目核心模块的性能基线数据,用于: 1. 监控性能回归 2. 指导优化方向 3. 评估系统容量


运行基准测试

# 运行所有基准测试
go test ./... -bench=. -benchmem

# 运行特定包的基准测试
go test ./pkg/message/... -bench=. -benchmem
go test ./pkg/channel/... -bench=. -benchmem
go test ./pkg/middleware/... -bench=. -benchmem
go test ./pkg/gateway/... -bench=. -benchmem

# 生成 CPU profile
go test ./pkg/message/... -bench=. -cpuprofile=cpu.prof

# 生成内存 profile
go test ./pkg/message/... -bench=. -memprofile=mem.prof

性能基线数据

1. Message 模块

消息模块是系统的核心数据结构,性能直接影响整体吞吐量。

基准测试 操作/秒 延迟 (ns/op) 内存分配 (B/op) 分配次数
NewMessage 7,400,000 ~170 288 2
SetMetadata 100,000,000 ~12 0 0
GetMetadata 150,000,000 ~8 0 0
JSONMarshal 310,000 ~3,600 897 8
JSONUnmarshal 180,000 ~6,700 1,248 31
JSONRoundTrip 107,000 ~11,000 2,010 37

关键发现: - 消息创建非常高效(~170ns) - Metadata 操作零内存分配 - JSON 序列化/反序列化是主要开销

优化建议: - 高频场景考虑使用对象池 - 避免频繁的 JSON 转换

2. Channel 模块

Channel 模块管理各平台适配器的基础功能。

基准测试 操作/秒 延迟 (ns/op) 内存分配 (B/op) 分配次数
BaseChannel_Creation 1,000,000,000 ~0.25 0 0
SetStatus 22,700,000 ~59 0 0
GetStatus 89,300,000 ~14 0 0
IsRunning 91,100,000 ~13 0 0
SetHandler 46,700,000 ~26 0 0
GetHandler 90,300,000 ~13 0 0
ParallelStatus 24,700,000 ~48 0 0
ParallelSetStatus 16,800,000 ~67 0 0

关键发现: - BaseChannel 创建几乎零开销 - 状态操作使用 RWMutex,读操作高效 - 并发写入有轻微竞争开销

优化建议: - 读多写少场景性能优异 - 可考虑使用 atomic 进一步优化状态读取

3. Middleware 模块

中间件模块实现消息处理链。

基准测试 操作/秒 延迟 (ns/op) 内存分配 (B/op) 分配次数
Chain_Creation 1,000,000,000 ~0.25 0 0
Chain_Use 16,600,000 ~66 97 0
Execute_Empty 411,100,000 ~2.8 0 0
Execute_Single 37,900,000 ~30 32 1
Execute5Middlewares 5,000,000 ~241 160 5
Execute10Middlewares 3,000,000 ~360 320 10
Execute20Middlewares 1,600,000 ~726 640 20
LoggingMiddleware 6,900,000 ~168 192 6
RealWorld_Scenario 2,100,000 ~600 896 13

关键发现: - 空链执行几乎零开销 - 每个中间件增加约 30-35ns 延迟 - 中间件数量与延迟呈线性关系

优化建议: - 控制中间件数量在 10 个以内 - 高频路径减少不必要的中间件

4. Gateway 模块

Gateway 是消息路由的核心组件。

基准测试 操作/秒 延迟 (ns/op) 内存分配 (B/op) 分配次数
Creation 100,000,000 ~12 0 0
RegisterChannel 20,900,000 ~58 24 1
GetChannel 56,700,000 ~22 0 0
RegisterHandler 1,000,000,000 ~0.25 0 0
MessageRouting 51,700,000 ~23 0 0
ParallelGetChannel 22,600,000 ~58 0 0
MultiChannel_100 33,100,000 ~34 0 0

关键发现: - Channel 获取和消息路由非常高效 - 并发访问性能良好 - 多 Channel 场景无明显性能下降

优化建议: - 当前实现已满足单用户场景需求 - 如需扩展到多用户,考虑分片策略


吞吐量分析

消息处理管道

消息接收 → 中间件链 → Channel发送
   ~8ns      ~600ns      ~23ns

理论最大吞吐量: - 纯消息创建: ~7M msg/s - 完整处理管道: ~1.5M msg/s - 包含JSON序列化: ~150K msg/s

瓶颈分析

  1. JSON 序列化/反序列化: 最大开销来源
  2. 中间件链: 每个中间件增加约 30ns
  3. HTTP 请求: 外部 API 调用(未在基准测试中)

内存使用分析

单消息内存占用

组件 内存占用
Message 结构体 ~288 B
JSON 序列化后 ~900 B
完整处理管道 ~1.3 KB

并发场景内存估算

并发消息数 内存占用估算
100 ~130 KB
1,000 ~1.3 MB
10,000 ~13 MB

性能回归检测

CI 集成示例

# .github/workflows/benchmark.yml
name: Benchmark
on: [push, pull_request]
jobs:
  benchmark:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: '1.23'
      - name: Run benchmark
        run: go test ./... -bench=. -benchmem | tee benchmark.txt
      - name: Compare with baseline
        run: |
          # 比较逻辑
          echo "Compare with baseline benchmarks"

回归阈值建议

指标 警告阈值 失败阈值
延迟增加 >10% >25%
内存增加 >15% >30%
分配次数增加 >20% >50%

优化历史

v1.0.0 (2026-03-31)

初始基线: - 消息创建: 170 ns/op - 中间件执行(5个): 241 ns/op - 消息路由: 23 ns/op

已知限制: - Message.Metadata 非线程安全 - 无对象池优化


附录

A. 完整基准测试输出

goos: darwin
goarch: amd64
pkg: github.com/example/gort/pkg/message
cpu: Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz
BenchmarkNewMessage-12                           7476950               169.9 ns/op           288 B/op          2 allocs/op
BenchmarkMessage_SetMetadata-12                 100000000               11.68 ns/op            0 B/op          0 allocs/op
BenchmarkMessage_GetMetadata-12                 146961363                8.097 ns/op           0 B/op          0 allocs/op
BenchmarkMessage_JSONMarshal-12                   312039              3587 ns/op     897 B/op          8 allocs/op
BenchmarkMessage_JSONUnmarshal-12                 181586              6727 ns/op    1248 B/op         31 allocs/op

pkg: github.com/example/gort/pkg/channel
BenchmarkBaseChannel_Creation-12                1000000000               0.2473 ns/op          0 B/op          0 allocs/op
BenchmarkBaseChannel_SetStatus-12               22679388                59.29 ns/op            0 B/op          0 allocs/op
BenchmarkBaseChannel_GetStatus-12               89302510                14.02 ns/op            0 B/op          0 allocs/op

pkg: github.com/example/gort/pkg/middleware
BenchmarkChain_Creation-12                              1000000000               0.2464 ns/op          0 B/op          0 allocs/op
BenchmarkChain_Execute_Single-12                        37929349                30.00 ns/op           32 B/op          1 allocs/op
BenchmarkMiddleware_WithRealWorldScenario-12             2141002               600.4 ns/op           896 B/op         13 allocs/op

pkg: github.com/example/gort/pkg/gateway
BenchmarkGateway_Creation-12                    100000000               12.32 ns/op            0 B/op          0 allocs/op
BenchmarkGateway_GetChannel-12                  56663090                21.60 ns/op            0 B/op          0 allocs/op
BenchmarkGateway_MessageRouting-12              51724806                22.78 ns/op            0 B/op          0 allocs/op

B. 性能分析工具

# CPU 分析
go test -bench=. -cpuprofile=cpu.prof
go tool pprof -http=:8080 cpu.prof

# 内存分析
go test -bench=. -memprofile=mem.prof
go tool pprof -http=:8080 mem.prof

# 火焰图
go test -bench=. -cpuprofile=cpu.prof
go tool pprof -png cpu.prof > flame.png

维护说明: 1. 每次重大更新后重新运行基准测试 2. 更新本文档中的性能数据 3. 如发现性能回归,需在 PR 中说明原因