139 lines
6.7 KiB
Markdown
139 lines
6.7 KiB
Markdown
# macOS 平台首消息性能测试报告(连续新会话)
|
||
|
||
**报告日期**: 2026-03-31
|
||
**测试平台**: macOS
|
||
**引擎类型**: qimingcode
|
||
**日志来源**: `/Users/apple/.qimingclaw/logs/perf.2026-03-31.log`(00:17:30 ~ 00:20:39)
|
||
**参考模板**: `docs/optimization/MACOS-FIRST-MESSAGE-PERF-REPORT-2026-03-24.md`
|
||
|
||
---
|
||
|
||
## 执行摘要
|
||
|
||
本报告针对“连续新开会话”的**首条消息首次响应性能**进行核对,口径为:
|
||
|
||
- 主要口径:`create-workspace -> sse.firstToken`
|
||
- 辅助口径:`/chat received -> 首 token`(`/chat` + `sendToFirstUpdate`)
|
||
|
||
本轮共观测到 6 次新会话尝试:
|
||
1. **5 次完整会话**(均包含 `sse.firstToken`)
|
||
2. **1 次中断会话**(仅 `create-workspace`,未进入 `/chat`)
|
||
|
||
### 关键发现
|
||
|
||
| 指标 | 本轮结果(5 次完整会话) | 说明 |
|
||
|-----|------------------|------|
|
||
| 首次响应(create-workspace -> firstToken) | **平均 9.307s**(8.063s ~ 10.928s) | 用户体感“首字出来”耗时 |
|
||
| `/chat` 总耗时 | **平均 2.955s**(2.060s ~ 3.697s) | 前置阶段 |
|
||
| `sendToFirstUpdate` | **平均 6.304s**(5.885s ~ 7.699s) | 首 token 等待阶段,主瓶颈 |
|
||
| `/chat` 内 `ensureEngine` | **平均 2.042s**(1.367s ~ 3.011s) | A 段内部主耗时 |
|
||
| 稳定性 | 5/5 完整会话成功 | 本时间窗内未见 `newSession/chat` 报错 |
|
||
|
||
---
|
||
|
||
## 一、测试会话数据
|
||
|
||
### 1.1 五次完整新会话(首消息)
|
||
|
||
| 会话 | project_id | rid | session_id | create-workspace | `/chat` | ensureEngine | sessionSetup | sse.connect | sse.firstToken | 首次响应(create->firstToken) |
|
||
|-----|------------|-----|------------|------------------|---------|--------------|--------------|-------------|----------------|-------------------------------|
|
||
| S1 | 1564329 | `0d3f44ba` | `ses_2c076bcb0ffeNfAHi2Yiu6tpru` | 00:17:30.613 | 3169ms | 1672ms | 1495ms | 00:17:33.851 | 00:17:39.723 | **9.110s** |
|
||
| S2 | 1564331 | `b2d8d26f` | `ses_2c075ef03ffeMiHTQKKR4h0FkZ` | 00:18:23.562 | 2652ms | 1982ms | 669ms | 00:18:26.284 | 00:18:32.234 | **8.672s** |
|
||
| S3 | 1564332 | `1b4b5eeb` | `ses_2c07552afffeFIQODrEZMYpydC` | 00:19:02.567 | 3697ms | 3011ms | 683ms | 00:19:06.309 | 00:19:12.328 | **9.761s** |
|
||
| S4 | 1564333 | `c00c4d52` | `ses_2c074e299ffe6qfg8LTgbN2lET` | 00:19:32.857 | 2060ms | 1367ms | 692ms | 00:19:35.003 | 00:19:40.920 | **8.063s** |
|
||
| S5 | 1564334 | `0d815846` | `ses_2c0742965ffebmYiW5e8JIydTk` | 00:20:19.169 | 3199ms | 2179ms | 1019ms | 00:20:22.411 | 00:20:30.097 | **10.928s** |
|
||
|
||
### 1.2 中断会话(仅创建工作区)
|
||
|
||
| 时间 | rid | 事件 |
|
||
|-----|-----|------|
|
||
| 00:18:08.206 | `5mia20hej` | 仅 `create-workspace`,未进入 `/chat`,不纳入首次响应统计 |
|
||
|
||
---
|
||
|
||
## 二、性能分析(首消息首次响应口径)
|
||
|
||
### 2.1 首次响应时间结构(均值)
|
||
|
||
```text
|
||
平均首次响应(create-workspace -> firstToken): 9.307s
|
||
├── create-workspace -> /chat received: ~0.047s(0.5%)
|
||
├── A: /chat received -> /chat 返回: 2.955s(31.8%)
|
||
└── B: /chat 返回 -> firstToken: 6.304s(67.7%)
|
||
```
|
||
|
||
结论:
|
||
- 若目标是“新会话首条消息尽快出首字”,**B 段是主瓶颈**(约 2/3)。
|
||
- A 段次之;其中仍以 `ensureEngine` 为主,但总体占端到端首响仅约 22%。
|
||
|
||
### 2.2 A 段内部(/chat 阶段)分解
|
||
|
||
| 指标 | 平均耗时 | 占 A 段 |
|
||
|-----|---------|--------|
|
||
| ensureEngine | 2042ms | 69.1% |
|
||
| sessionSetup/chat 其余 | 912ms | 30.9% |
|
||
|
||
说明:
|
||
- A 段仍有优化空间,但不是首响的第一优先级。
|
||
- 本轮 A 段波动(2.060s~3.697s)主要来自 `ensureEngine` 与 `sessionSetup` 抖动。
|
||
|
||
### 2.3 抖动观察
|
||
|
||
| 阶段 | 最小 | 最大 | 波动特征 |
|
||
|-----|------|------|---------|
|
||
| `/chat` | 2060ms | 3697ms | 中等波动 |
|
||
| `sendToFirstUpdate` | 5885ms | 7699ms | 中等偏高,S5 明显偏慢 |
|
||
| `firstToken->end_turn` | 8008ms | 25402ms | 该段波动极大(与“首响”无关,但影响整体完成时间) |
|
||
|
||
---
|
||
|
||
## 三、结论与建议
|
||
|
||
### 3.1 结论
|
||
|
||
1. 本轮“新会话首条消息首次响应”平均约 **9.3s**。
|
||
2. 主要瓶颈不在 `/chat` 前置,而在 **`/chat` 返回后等待首 token(B 段)**。
|
||
3. 本时间窗内 5 次完整会话均成功,未出现上一轮的 `newSession` 内部错误。
|
||
|
||
### 3.2 建议(按首响收益排序)
|
||
|
||
1. 先优化 `sendToFirstUpdate`(目标先压到 <5s,再冲 <4s)。
|
||
2. 再收敛 `ensureEngine` 抖动(优先把 3s 档位压回 2s 内)。
|
||
3. 保留当前 `sse.firstToken` 埋点,后续把优化验收口径统一为 `create-workspace -> sse.firstToken`。
|
||
|
||
---
|
||
|
||
## 附录:关键日志摘录
|
||
|
||
```text
|
||
[2026-03-31 00:17:30.613] [PERF] create-workspace: 66ms rid=[j197gc94h]
|
||
[2026-03-31 00:17:33.838] [PERF] /chat: 3169ms rid=0d3f44ba (parseBody=0ms validate=1ms workspace=0ms engine=1672ms chat=1496ms)
|
||
[2026-03-31 00:17:39.723] [PERF] sse.firstToken session=ses_2c076bcb0ffeNfAHi2Yiu6tpru
|
||
[2026-03-31 00:17:39.723] [PERF] acp.prompt.sendToFirstUpdate: 5885ms sessionId=ses_2c076bcb0ffeNfAHi2Yiu6tpru
|
||
|
||
[2026-03-31 00:18:23.562] [PERF] create-workspace: 49ms rid=[fg7ng07b6]
|
||
[2026-03-31 00:18:26.269] [PERF] /chat: 2652ms rid=b2d8d26f (parseBody=0ms validate=1ms workspace=0ms engine=1982ms chat=669ms)
|
||
[2026-03-31 00:18:32.234] [PERF] sse.firstToken session=ses_2c075ef03ffeMiHTQKKR4h0FkZ
|
||
[2026-03-31 00:18:32.234] [PERF] acp.prompt.sendToFirstUpdate: 5965ms sessionId=ses_2c075ef03ffeMiHTQKKR4h0FkZ
|
||
|
||
[2026-03-31 00:19:02.567] [PERF] create-workspace: 51ms rid=[fy8f9owgd]
|
||
[2026-03-31 00:19:06.296] [PERF] /chat: 3697ms rid=1b4b5eeb (parseBody=1ms validate=0ms workspace=1ms engine=3011ms chat=684ms)
|
||
[2026-03-31 00:19:12.328] [PERF] sse.firstToken session=ses_2c07552afffeFIQODrEZMYpydC
|
||
[2026-03-31 00:19:12.328] [PERF] acp.prompt.sendToFirstUpdate: 6033ms sessionId=ses_2c07552afffeFIQODrEZMYpydC
|
||
|
||
[2026-03-31 00:19:32.857] [PERF] create-workspace: 72ms rid=[2kfaik1wz]
|
||
[2026-03-31 00:19:34.980] [PERF] /chat: 2060ms rid=c00c4d52 (parseBody=0ms validate=0ms workspace=1ms engine=1367ms chat=692ms)
|
||
[2026-03-31 00:19:40.920] [PERF] sse.firstToken session=ses_2c074e299ffe6qfg8LTgbN2lET
|
||
[2026-03-31 00:19:40.920] [PERF] acp.prompt.sendToFirstUpdate: 5940ms sessionId=ses_2c074e299ffe6qfg8LTgbN2lET
|
||
|
||
[2026-03-31 00:20:19.169] [PERF] create-workspace: 46ms rid=[e6dtwydgo]
|
||
[2026-03-31 00:20:22.398] [PERF] /chat: 3199ms rid=0d815846 (parseBody=0ms validate=1ms workspace=0ms engine=2179ms chat=1019ms)
|
||
[2026-03-31 00:20:30.097] [PERF] sse.firstToken session=ses_2c0742965ffebmYiW5e8JIydTk
|
||
[2026-03-31 00:20:30.097] [PERF] acp.prompt.sendToFirstUpdate: 7699ms sessionId=ses_2c0742965ffebmYiW5e8JIydTk
|
||
```
|
||
|
||
---
|
||
|
||
*报告生成时间: 2026-03-31*
|
||
*备注: 本报告仅针对“新会话首条消息首次响应(first token)”口径,不包含完整回答结束耗时优化判断。*
|