# 2026-06-29 性能日志 ## 用户目标 用户当前使用 `V2.1.37 (build 20260629.0059)`,反馈每次识别后等待时间变长。用户同意先加入精确性能日志,不先盲改识别或粘贴逻辑。 ## 已完成事项 - 确认当前问题排查方向:先把录音停止、尾部等待、模型识别、后处理、等待热键释放、macOS 粘贴链路拆成可观测耗时段。 - 在主识别流水线加入 `PERF` 前缀日志。 - 在 macOS 剪贴板粘贴链路加入 `PERF paste_clipboard_done` 内部耗时日志。 - 运行 `gofmt`。 - 运行 `go test ./...`,测试通过;存在当前环境下的 macOS 链接版本 warning,但无测试失败。 - 运行 `git diff --check`,通过。 - 用户确认生成诊断 DMG 后,递增到 `2.1.38 (build 20260629.2014)`。 - 已创建源码 commit `9d4f977026bbb4516f8cc97f715c0dc28bf2a13f`。 - 已创建本地 tag `v2.1.38-build20260629.2014-diagnostic`。 - 已生成 arm64 本地诊断 DMG,并通过 `hdiutil verify`。 ## 关键决策 - 本轮只加诊断日志,不改变录音、识别、尾部保护、粘贴、UI 文案和版本号。 - 日志不额外记录音频内容;仅记录采样数、音频时长、文本 rune 数和分段耗时。 - 日志统一使用 `PERF` 前缀,便于从 `app.log` 中筛选。 - 本轮诊断包是本地诊断候选包,不是 App Store 上传包;最低系统版本为 macOS `14.0`。 ## 文件变更 - `/Users/ar/Projects/PrivateVoice/privatevoice.src/app.go` - 新增识别流水线 `PERF` 日志。 - 记录 release tail wait、stop audio、voice activity check、recognize、postprocess、history、hotkey release wait、paste、pipeline total 等耗时。 - `/Users/ar/Projects/PrivateVoice/privatevoice.src/internal/input/paste_darwin.go` - 新增 macOS 粘贴内部 `PERF paste_clipboard_done` 日志。 - 记录辅助权限检查、剪贴板快照、写剪贴板、剪贴板校验、Cmd+V 和总耗时。 - `/Users/ar/Projects/PrivateVoice/privatevoice.src/build/darwin/Info.plist` - 更新版本为 `2.1.38`,build 为 `20260629.2014`。 - `/Users/ar/Projects/PrivateVoice/privatevoice.src/frontend/package.json` - 更新版本为 `2.1.38`。 - `/Users/ar/Projects/PrivateVoice/privatevoice.src/frontend/package-lock.json` - 更新版本为 `2.1.38`。 - `/Users/ar/Projects/PrivateVoice/CHANGELOG.md` - 新增 `v2.1.38` 性能诊断包说明。 - `/Users/ar/Projects/PrivateVoice/Release/PrivateVoice-Dictation-2.1.38-build20260629.2014-diagnostic/` - 新增诊断 DMG、`SHA256SUMS.txt` 和 `RELEASE_MANIFEST.md`。 ## 未决问题 - 需要用户安装并使用诊断包几天,复现慢感后再读取 `PERF` 日志判断慢在尾部等待、模型识别还是粘贴链路。 - 项目未找到 `CODEGRAPH.md`,本轮未做 CODEGRAPH 更新;manifest 已记录该事实。 ## 后续建议 - 用户安装诊断 DMG 后,先复现 3-5 句短句和 2-3 句长句。 - 重点检查 `PERF pipeline_done total_ms`、`PERF recognize_done recognize_ms`、`PERF paste_done paste_ms`、`PERF paste_clipboard_done verify_ms`。 - 如果主要慢在尾部等待,可评估把 SenseVoice 的 `defaultReleaseTailDelay` 从 `300ms` 降到更小值,同时回归“首字/尾字不丢”。