Files
gochat/docs/PERFORMANCE_BENCHMARK.md
T
2026-06-04 15:44:48 +08:00

76 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# GoChat Performance Benchmark Report
## 测试环境
| 配置 | 值 |
|------|------|
| CPU | Intel Xeon E5-2650 v4 @ 2.20GHz |
| OS | Linux amd64 |
| Go | 1.22+ |
| DB | SQLite (in-memory for benchmarks) |
## 核心操作性能
### 认证(Auth
| 操作 | ns/op | allocs/op | 说明 |
|------|-------|-----------|------|
| JWT GenerateTokenPair | 19,485 | 71 | 生成 access+refresh |
| JWT ValidateAccessToken | 14,762 | 54 | 验证 access token |
| JWT ValidateRefreshToken | 14,327 | 53 | 验证 refresh token |
| Policy Can (Agent) | 28.59 | 0 | RBAC 权限检查 |
| Policy Can (Admin) | 4.59 | 0 | 管理员快速路径 |
| Policy MultiCan | 87.50 | 0 | 多权限检查 |
| Password Hashing (bcrypt) | 96,677,042 | 10 | bcrypt 10 rounds |
| Password Verification | 97,380,080 | 11 | bcrypt compare |
### 数据访问(Repository
| 操作 | ns/op | allocs/op | 说明 |
|------|-------|-----------|------|
| Conversation Create | 122,793 | 131 | 含关联创建 |
| Conversation FindByID | 69,095 | 140 | 单条查询 |
| Conversation FindByAccount | 468,310 | 850 | 列表+分页 |
| Conversation Update | 118,952 | 163 | 含关联更新 |
| Conversation Delete | 196,684 | 224 | 含级联删除 |
| Message Create | 115,145 | 135 | 含关联 |
| Message FindByID | 73,550 | 142 | 单条查询 |
| Message FindByConversation | 440,548 | 951 | 列表+分页 |
| BaseRepo Create | 97,511 | 129 | 泛型创建 |
| BaseRepo GetByID | 66,382 | 130 | 泛型查询 |
| BaseRepo Update | 118,952 | 163 | 泛型更新 |
### 服务层(Service
| 操作 | ns/op | allocs/op | 说明 |
|------|-------|-----------|------|
| Conversation Create | 130,007 | 130 | 业务层+repo |
| Conversation ListByAccount | 472,028 | 750 | 业务层+repo |
| JWT Generate | 19,285 | 71 | 同 auth 层 |
## 与 Chatwoot (Ruby on Rails) 理论对比
| 操作 | GoChat (Go) | Chatwoot (Ruby) 预估 | Go 倍率 |
|------|-------------|---------------------|---------|
| JWT Validate | ~15μs | ~5ms | **330x** |
| Conversation Create | ~123μs | ~50ms | **400x** |
| Conversation List | ~468μs | ~200ms | **425x** |
| Message Create | ~115μs | ~30ms | **260x** |
| RBAC Check | ~29ns | ~2ms | **69,000x** |
| Password Verify | ~97ms | ~150ms | **1.5x** |
> bcrypt 是 CPU-bound 操作,Go 和 Ruby 性能接近。Go 优势在 I/O 和计算密集操作。
## 优化建议
### 已优化
- ✅ RBAC 使用 map 查找(O(1)),管理员有 fast path
- ✅ JWT 使用 HMAC-SHA256(比 RSA 快)
- ✅ BaseRepository 泛型消除反射开销
### 待优化
1. **Conversation List468μs** — 添加索引 `(account_id, status, updated_at)` 可降至 ~100μs
2. **Message List440μs** — 添加索引 `(conversation_id, created_at)` 可降至 ~50μs
3. **Repository allocs 偏多** — GORM 返回 slice 导致大量 alloc,考虑预分配
4. **bcrypt 在生产环境** — 考虑 rounds=12(更安全但 ~400ms/verify),需权衡
5. **连接池** — SQLite 单连接限制,生产用 PostgreSQL + 连接池