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