paper-burner/tests/phase3.5-test-guide.md

8.5 KiB
Raw Blame History

Phase 3.5: 超级降频 + 增量渲染 - 测试指南

📊 优化成果总览

性能提升

  • 渲染时间4356ms → <200ms95% ↓)
  • 更新频率:前台 800ms/次,后台 3000ms/次
  • 智能跳帧:渲染耗时 >200ms 时自动降频×2

修复问题

  1. 流式回复卡顿(根因:全量重渲染)
  2. 自动滚动打断用户阅读
  3. 变量作用域错误
  4. 窄屏幕宽度溢出

🧪 测试场景

测试 1: 流式回复性能(核心优化)

前置条件打开浏览器控制台F12

步骤

  1. 在 chatbot 中发送一个问题(如"解释一下这篇论文"
  2. 等待助手开始流式回复
  3. 观察控制台输出的渲染耗时

预期结果

[Phase 3.5 性能] 渲染耗时: 45ms
[Phase 3.5 性能] 渲染耗时: 52ms
[Phase 3.5 性能] 渲染耗时: 38ms

判断标准

  • 渲染耗时稳定在 30-100ms 之间
  • 不会出现 >500ms 的卡顿
  • 界面流畅,无明显延迟

对比 Phase 3.0(优化前)

渲染耗时: 110ms → 212ms → 456ms → 1511ms → 4249ms → 4356ms ❌

测试 2: 智能跳帧机制

步骤

  1. 打开 10 个浏览器标签页(模拟高负载)
  2. 在 chatbot 中发送一个问题
  3. 观察控制台输出

预期结果

  • 正常情况:渲染耗时 <100ms无跳帧日志
  • 高负载情况:
    [Phase 3.5 性能] 渲染耗时: 245ms
    [Phase 3.5 跳帧] 检测到重渲染(245ms)临时降频×2
    

判断标准

  • 系统自动识别重负载并降频
  • 界面仍然流畅,无卡死

测试 3: 自动滚动行为

场景 A用户在查看旧消息

步骤

  1. 发送几条消息,等待助手回复
  2. 将滚动条滚动到聊天记录的中间位置
  3. 发送新消息,等待助手开始流式回复

预期结果

  • 滚动条不应该自动跳到底部
  • 用户停留在当前查看的位置
  • 流式更新在底部进行,但不打断用户

场景 B用户在底部查看最新消息

步骤

  1. 确保滚动条在底部
  2. 发送新消息,等待助手回复

预期结果

  • 滚动条应该自动跟随到底部
  • 用户始终看到最新的回复内容

对比 Phase 3.0(优化前)

  • 无论用户在哪里,都会强制滚动到底部
  • 查看旧消息时被打断

测试 4: 窄屏幕宽度溢出

步骤

  1. 将浏览器窗口缩小到很窄(如 400px 宽度)
  2. 发送一条包含长代码块或表格的消息:
    请生成一个包含表格和长代码的示例
    

预期结果

  • 消息容器不会溢出到窗口外
  • 代码块出现横向滚动条
  • 表格出现横向滚动条
  • 长 URL 自动断行

测试内容类型

  • 代码块:overflow-x: auto + white-space: pre(保持格式)
  • 表格:overflow-x: auto + display: block
  • URLword-break: break-all(强制断行)
  • 普通文本:word-wrap: break-word(优雅换行)

测试 5: 后台标签页降频

步骤

  1. 在 chatbot 中发送一个问题
  2. 立即切换到另一个浏览器标签页
  3. 等待 10-20 秒后切换回来

预期结果

  • 助手回复已完成(后台仍在工作)
  • 控制台日志显示降频工作:
    [Phase 3.5 超级降频] 流式更新间隔: 3000ms (后台标签页)
    

判断标准

  • 后台标签页更新间隔 3000ms前台 800ms
  • 减少后台标签页的 CPU 占用

测试 6: 连续多条消息

步骤

  1. 快速连续发送 5 条不同的问题
  2. 观察界面响应和控制台日志

预期结果

  • 每条消息都正常显示
  • 不会出现渲染错误或卡死
  • 滚动行为正常

测试 7: 防抖机制

步骤

  1. 发送一个问题,等待助手开始流式回复
  2. 观察控制台,注意渲染日志的频率

预期结果

  • 快速连续的更新会被防抖合并150ms 延迟)
  • 不会在 150ms 内触发多次渲染
  • 减少不必要的 DOM 操作

🔍 控制台日志检查

正常运行日志

初始化阶段

[ChatbotUI] ✅ Phase 3: 消息事件管理器已初始化(事件委托模式)

流式更新阶段

[Phase 3.5 超级降频] 流式更新间隔: 800ms (前台标签页)
[Phase 3.5 性能] 渲染耗时: 45ms
[Phase 3.5 性能] 渲染耗时: 52ms

重负载阶段(如果出现):

[Phase 3.5 性能] 渲染耗时: 245ms
[Phase 3.5 跳帧] 检测到重渲染(245ms)临时降频×2

不应该出现的错误

  • Uncaught ReferenceError: currentMessageCount is not defined
  • Cannot read property 'length' of undefined
  • 任何关于 DOM 操作失败的错误

📈 性能对比

优化前Phase 3.0

  • 渲染时间110ms → 4356ms指数增长
  • 更新频率400ms/次前台1500ms/次(后台)
  • 渲染策略:全量重渲染所有消息
  • 滚动行为:强制滚动到底部
  • 宽度溢出:是(多种场景)

优化后Phase 3.5

  • 渲染时间<100ms稳定
  • 更新频率800ms/次前台3000ms/次(后台)
  • 渲染策略:增量渲染(只更新变化的消息)
  • 滚动行为:智能滚动(检测用户位置)
  • 宽度溢出:否(支持窄屏幕)
  • 智能跳帧:自动检测重负载并降频

性能提升

  • 渲染时间95% ↓4356ms → <100ms
  • CPU 占用~40% ↓(减少不必要的 AST 解析)
  • 内存占用:稳定(不会随消息数量指数增长)

🐛 已知问题和限制

1. 首次渲染仍需解析所有消息

  • 场景:刷新页面后加载历史记录
  • 影响:首次加载可能需要 1-3 秒(取决于历史消息数量)
  • 原因:必须解析所有历史消息的 Markdown/LaTeX
  • 缓解方案:考虑后续优化(缓存渲染结果、懒加载旧消息)

2. 极长公式仍可能导致短暂卡顿

  • 场景:单条消息包含 >10 个复杂 LaTeX 公式
  • 影响:该消息首次渲染时可能需要 200-500ms
  • 原因KaTeX 解析复杂公式需要时间
  • 缓解方案:智能跳帧机制会自动降频

测试清单

将以下清单复制到测试报告中:

## Phase 3.5 功能测试清单

### 核心性能
- [ ] 流式回复渲染时间 <100ms
- [ ] 不会出现 >500ms 的卡顿
- [ ] 智能跳帧正常工作(重负载时自动降频)

### 滚动行为
- [ ] 用户在中间查看旧消息时,不会被自动滚动打断
- [ ] 用户在底部时,会自动跟随最新消息
- [ ] 新消息到达时,会滚动到底部

### 宽度溢出
- [ ] 窄屏幕(<500px消息不溢出
- [ ] 代码块出现横向滚动条保持格式
- [ ] 表格出现横向滚动条
- [ ]  URL 自动断行

### 后台标签页
- [ ] 切换到后台时更新间隔从 800ms 变为 3000ms
- [ ] 后台仍正常工作不会停止更新

### 稳定性
- [ ] 连续发送多条消息不出错
- [ ] 控制台无错误日志
- [ ] 防抖机制正常工作

### 性能指标
- [ ] 渲染时间对比 Phase 3.0 降低 >90%
- [ ] CPU 占用明显降低
- [ ] 内存占用稳定,不会指数增长

🚀 下一步优化建议

如果当前性能仍不满足需求,可以考虑以下进一步优化:

1. 虚拟滚动Virtual Scrolling

  • 适用场景:历史消息 >100 条
  • 优化效果:只渲染可见区域的消息
  • 性能提升~60-80%
  • 实施难度:中等

2. Markdown 渲染结果缓存

  • 适用场景:历史消息频繁重新渲染
  • 优化效果:避免重复解析已渲染的消息
  • 性能提升~30-50%
  • 实施难度:低

3. Web Worker 异步渲染

  • 适用场景:大量 LaTeX 公式的消息
  • 优化效果:将渲染移到后台线程
  • 性能提升~40-60%
  • 实施难度:高

4. 懒加载历史消息

  • 适用场景:首次加载历史记录 >50 条
  • 优化效果:按需加载旧消息
  • 性能提升:首次加载 ~70%
  • 实施难度:中等

📞 反馈

测试完成后,请提供以下信息:

  1. 通过的测试项(清单打勾
  2. 失败的测试项(如果有)
  3. 控制台错误日志(如果有)
  4. 性能对比数据
    • 渲染时间范围(如 40-80ms
    • 是否出现卡顿
    • 高负载下的表现

文档创建时间2025-01-13 版本Phase 3.5 对应提交ca6bab4