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

3.0 KiB
Raw Blame History

消息库浏览模型性能优化

已修改两个目录的 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 项。

未访问或输出真实客户消息,没有修改用户数据库、配置或队列。