47 lines
3.0 KiB
Markdown
47 lines
3.0 KiB
Markdown
# 消息库浏览模型性能优化
|
||
|
||
已修改两个目录的 `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 项。
|
||
|
||
未访问或输出真实客户消息,没有修改用户数据库、配置或队列。
|