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 场景无明显性能下降
优化建议: - 当前实现已满足单用户场景需求 - 如需扩展到多用户,考虑分片策略
吞吐量分析¶
消息处理管道¶
理论最大吞吐量: - 纯消息创建: ~7M msg/s - 完整处理管道: ~1.5M msg/s - 包含JSON序列化: ~150K msg/s
瓶颈分析¶
- JSON 序列化/反序列化: 最大开销来源
- 中间件链: 每个中间件增加约 30ns
- 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 中说明原因