Files
kefu/deploy/loading-performance-20260917/BROWSER_PERFORMANCE_REPORT.md
T
2026-09-21 10:34:06 +08:00

47 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.
# 消息库浏览模型性能优化
已修改两个目录的 `wxwork_message_browser.py`,新增 `test_wxwork_browser_performance.py`:
- `C:/wechat_rpa`
- `C:/kefu/wechat_rpa`
两目录原浏览模块内容一致;修改前分别备份到 `backups/loading-performance-20260917/wxwork_message_browser.py`。本分项未修改 `wxwork_db.py`、Qt、协议引擎、真实配置或真实数据库。
## 改动
原实现每次切换会话都会重新读取全部账号名称、逐库统计、重复全表消息计数/会话分组,再在消息表中筛选排序。搜索还只检查最近 1000 个会话,较旧会话会漏查。
现在采用有界内存缓存:
- 文件状态、名称、消息数量、会话数量分别缓存。
- SQLite 首次完成排序分组,只缓存紧凑的会话行号数组;显示页按 rowid 读取消息,避免每次切换扫描全部正文。
- 只读取当前会话页的正文;搜索时分批读取会话预览,覆盖全部会话,限制原始内容峰值内存。
- 缓存按数据库路径、大小、纳秒修改时间、创建/变更时间、inode 和 WAL 文件状态失效;支持同路径文件替换、WAL-only 提交、账号名称更新以及删除消息。显式刷新强制清缓存。
- 读取行时再次校验 conversation_id,防止索引建立后数据库替换、复用 rowid 导致串会话。遇到此竞争,宁可返回空页/空预览,后续刷新恢复,绝不显示其他会话正文。
- 缓存不保留 SQLite 连接,不修改源库,也不向源库新增索引;并发请求受锁保护,账号路径隔离。
- `load_browser_snapshot` 保持原参数兼容,新增可选 `conversation_offset=0`、`message_offset=0`,支持正确分页,UI 不传时行为不变。
## 合成性能测量
测试数据为临时 SQLite:50 万条消息、2500 个会话,无数据库索引。全部内容是生成的测试字符串。测量仅覆盖本地浏览模型,不代表远程密钥获取或网络患者关联耗时。
| 操作 | 修改前 | 修改后 |
| --- | ---: | ---: |
| 第一次打开 | 1.363 秒 | 1.223 秒 |
| 切换会话(三次) | 1.297–1.394 秒 | 2.9–5.1 毫秒 |
| 搜索旧会话 | 1.341 秒且漏查 | 62 毫秒,正确返回 |
| 重复搜索 | 1.300 秒且漏查 | 8.6 毫秒,正确返回 |
| 会话切换全量聚合次数 | 7 次/请求 | 0 次/请求 |
原始数据见 `browser-before.json`、`browser-after.json`,可用 `benchmark_browser.py` 复现。最后增加的取行会话核对仅多读取一列;上述性能数据来自身份核对前一版,身份核对后的完整功能回归已经通过。
## 验证
两目录各 43 项回归通过,退出码 0:
- `test_wxwork_browser_performance`:20 项,覆盖缓存、查询次数、WAL、文件替换竞争、多账号并发、名称更新、删除、分页、时间戳相同排序、旧会话搜索、只读性等。
- `test_wxwork_message_browser`:原 3 项。
- `test_wxwork_local_setup`:原初始化相关 20 项。
未访问或输出真实客户消息,没有修改用户数据库、配置或队列。