diff --git a/_AI_USAGE_LOG.md b/_AI_USAGE_LOG.md index 8085c45..691ab0b 100644 --- a/_AI_USAGE_LOG.md +++ b/_AI_USAGE_LOG.md @@ -229,3 +229,4 @@ | 2026-08-26 19:05 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 仓库目录对齐赛道二 §8 成果物规范:分支 vscode-code-reviewer 合并入 main(冲突文件 docs/superpowers/specs/2026-07-10-code-reviewer-design.md 取开发分支完整版,add/add 冲突已解决);src/test 迁移至根目录 tests/(16 个测试 + fixtures/manual),36 处 import '../' → '../src/';新建 tsconfig.test.json(rootDir ".",include tests + src/types 声明文件);.vscode-test.mjs files 改 'out/tests/**/*.test.js';package.json 新增 compile:test、test 改为 compile:test && vscode-test;.gitignore 移除 src/test/;3 个中文文件名 demo-*插件实测覆盖率报告.md 重命名为 demo-*-coverage-report.md;git rm --cached 解除 vscode-code-reviewer-1.0.0.vsix 跟踪;README 追加演示视频(进行中)章节。验证:lint 0 error / compile 通过 / compile:test 通过 / npm test 116 passing | 中间产物:tsconfig.test.json 初版 include 仅 tests/**/*,编译报 stylelint-config-recommended 声明缺失(主 tsconfig include src/**/* 含 src/types 声明文件而 test 配置未含),补 include src/types/**/* 后通过 | tests/ tests/fixtures/ tests/manual/ tsconfig.test.json(新建) .vscode-test.mjs package.json .gitignore README.md data/demo-eslint/reports/demo-eslint-coverage-report.md data/demo-sqlfluff/reports/demo-sqlfluff-coverage-report.md data/demo-stylelint/reports/demo-stylelint-coverage-report.md | deepseek-v4-flash | | 2026-08-26 19:16 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 补齐 tests/ 实验报告(§8 成果物 04,coverage/ 按用户确认忽略):新建 tests/test-execution-log.md(测试执行日志:命令/环境/结果 116 passing 0 failing);tests/test-cases.md(从 16 个测试文件提取 suite/test 声明,116 条用例清单+覆盖点+统计);tests/measure/measure-review-time.mjs(提效测量脚本:内联复刻 src/rules/builtin-rules.ts 的 ESLint/Stylelint 内置配置,用 eslint/stylelint 引擎直跑 data/demo-*/src 样例计时,输出 tests/measure/results/measure-results.json);tests/measure/performance-comparison.md(提效对比骨架:测量方法+对比维度+插件侧实测数据已填 demo-eslint 6 文件 294 诊断 192.2ms / demo-stylelint 2 文件 115 诊断 2106.7ms / 合计 409 诊断 2298.9ms,人工基线留待实测)。验证:measure 脚本实测运行产出 JSON / lint 0 error(仅既有 mockDocument 2 warning)/ 主流程 npm test 116 passing 不受影响 | 中间产物:measure 脚本初版 import '../../src/rules/builtin-rules'(ESM 无法直接加载 TS 报 ERR_MODULE_NOT_FOUND)→ 改 import 编译产物 '../../out/rules/builtin-rules.js' 又因模块顶层 import vscode 脱离扩展宿主报 MODULE_NOT_FOUND → 最终改为内联规则配置(与 data/demo-eslint/run-coverage.mjs 既有模式一致);measure() 计时函数初版未 await 异步 fn,result 为 Promise 导致 result.reduce 报错,改为 async/await 后通过 | tests/test-execution-log.md(新建) tests/test-cases.md(新建) tests/measure/measure-review-time.mjs(新建) tests/measure/performance-comparison.md(新建) tests/measure/results/measure-results.json(新建) | deepseek-v4-flash | | 2026-08-26 21:29 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 修复 Windows 下 spawn 拉起 .cmd/.bat 必然 EINVAL 问题(方案 A):auxClasspath.ts exec() 对 Windows 批处理命令(mvnw.cmd/gradlew.bat/mvn.cmd/gradle.bat)改走 spawn('cmd.exe', ['/d','/s','/c', 双层引号包装命令]) + windowsVerbatimArguments:true,非批处理分支不变;新增私有 helper quoteCmdArg(安全字符正则含 \ 及 Windows 路径符,含空格/引号参数用 cmd 双引号转义 "→"")。修复 Maven/Gradle 自动 aux classpath 在 Windows 完全失效问题。验证:实测 npm.cmd 与含空格路径+含空格参数 .cmd 冒烟通过(exit 0)/ lint 0 error(仅既有 mockDocument 2 warning)/ compile 通过 / npm test 116 passing | 中间产物:①cmd /s /c 单层引号方案失败——命令首字符为引号时 cmd 剥首尾引号并移除最后一个引号字符,导致路径后残留引号拼接成非法命令(实测 'F:\nodejs\node.exe" -e "console.log' 无法识别),改为外层再包一层引号(双层引号)后通过;②quoteCmdArg safe 正则初版漏 \ 反斜杠,考虑 -Dmdep.outputFile=C:\... 参数补入;③PowerShell 双引号 here-string 内联 node 测试脚本引号被解析破坏报 SyntaxError,改用单引号 here-string 后通过;④是否加 windowsVerbatimArguments 决策点——不加则 Node 二次转义拼好的命令行,实测确认必须加 | src/services/auxClasspath.ts | deepseek-v4-flash | +| 2026-08-27 14:59 | ① 用户提出 → ② 需求澄清 → ③ 方案设计 → ④ 人类审批 → ⑤ 编码实现 → ⑥ 审查验证 | 新增性能优化证据文档 docs/superpowers/specs/2026-08-27-performance-optimization.md:按 Stage ② 澄清共识(优化措施整理文档、覆盖全部已实现优化、放入 specs 系列目录)产出六节结构文档——概述(统计口径:仅收录已实现优化、不含虚构定量数据)、缓存类优化(静态分析结果缓存 orchestrator/analysisCache、方法级审查状态缓存 status-cache、PMD auxclasspath 缓存含 mtime 校验与 inflight 并发合并、AI Provider 注册表缓存 registry/cachedProviders)、流程类优化(自定义规则语言预过滤 rule-filter、修复预生成持久化 aiFixEngine+fixPending、规则导入去重 dedup-prompt、debounce 工具)、界面与工程类优化(审查面板渲染 webview 主题适配、适配器三层配置)、收益汇总表、附录出处索引。每项统一「实现位置/机制/收益」格式。验证:19 个引用路径全部核实存在,纯新增文档无代码变更,不影响 lint/compile/test | 中间产物:澄清阶段先问「证据类型」(基准报告 vs 整理文档 vs 两者)用户选整理文档;再问「覆盖范围」用户选全部已实现优化;确认文档位置时用户在根 docs/ 与 specs 系列目录间选后者 | docs/superpowers/specs/2026-08-27-performance-optimization.md(新建) | deepseek-v4-flash | diff --git a/docs/superpowers/specs/2026-08-27-performance-optimization.md b/docs/superpowers/specs/2026-08-27-performance-optimization.md new file mode 100644 index 0000000..993f548 --- /dev/null +++ b/docs/superpowers/specs/2026-08-27-performance-optimization.md @@ -0,0 +1,127 @@ +# 性能优化证据文档 + +> 项目:vscode-code-reviewer +> 性质:优化措施整理文档(收录已落地实现的优化点,非基准测试报告) + +## 1. 概述 + +### 1.1 目的 + +- 汇总工程中已实现的性能优化措施,形成可追溯、可评审的优化证据 +- 每一项优化均给出**实现位置(文件与方法)**、**机制**与**收益**,便于代码评审与答辩演示 +- 所有条目均为已在 `src/` 中落地实现的代码,不含设计未落地项 + +### 1.2 统计口径 + +- 只收录已实现的优化;定量数据(耗时、内存等)需另行基准测试,本文件不虚构测量数字 +- 收益均为定性描述,标注「间接收益」的条目指优化主要目的非性能但对性能有正向影响 + +## 2. 缓存类优化 + +### 2.1 静态分析结果缓存 + +- 实现位置:`src/orchestrator/orchestrator.ts`(`analysisCache`、`setAnalysisResult` / `getAnalysisResult` / `clearAnalysisResult`) +- 机制:以 `document.uri` 为键缓存静态分析结果(diagnostics + adapterId + workingDir)。审查命令、CodeLens、修复命令(`fixIssue` / `fixAll`)等通过 `getAnalysisResult` 复用同一份结果,避免对同一文档重复调用 linter 进程 +- 收益:消除同一文档在多次视图刷新/修复操作中的重复静态分析开销 + +### 2.2 方法级审查状态缓存(CodeLens) + +- 实现位置:`src/scope/status-cache.ts`(`ReviewStatusCache`)、`src/views/codeLensProvider.ts`、`src/activation/commands.ts`(更新入口) +- 机制:以「文件 URI + 方法名」为键缓存方法级审查状态(规则命中数等)。CodeLens 渲染时直接读缓存,命令完成后只更新对应键;文档关闭时通过 `clearDocument` 清理 +- 收益:避免每次 CodeLens 刷新都重新扫描方法级审查结果,减少高频 UI 刷新下的重复计算 + +### 2.3 PMD auxclasspath 解析缓存(含并发合并) + +- 实现位置:`src/services/auxClasspath.ts`(`AuxClasspathResolver`:`cache` + `inflight`) +- 机制:以工作目录为键缓存 Maven/Gradle 构建文件解析出的 classpath;缓存项记录构建文件路径与 `mtimeMs`,构建文件未变化时直接复用。`inflight` 表合并同一目录的并发请求,使同一构建任务只执行一次(构建超时 120s);配置变更时通过 `clear` 失效 +- 收益:PMD 分析前置的 classpath 解析从「每次分析都构建」降为「仅构建文件变更时构建」,且并发下不重复跑构建 + +### 2.4 AI Provider 注册表缓存 + +- 实现位置:`src/ai/registry.ts`(`cachedProviders`、`getProviders`、`invalidateProviderCache`)、`src/views/setupView.ts`(失效触发) +- 机制:内置 `providers.json` 与用户 `.code-review/providers.json` 合并结果在模块级缓存,首次读取后复用;仅当用户在设置面板修改 Provider 配置(`invalidateProviderCache`)时才重新读取磁盘 +- 出处设计:`2026-07-28-provider-registry-dynamic-design.md` +- 收益:避免每次获取 Provider/模型列表都重复读盘、解析 JSON 并合并 + +## 3. 流程类优化 + +### 3.1 自定义规则语言预过滤 + +- 实现位置:`src/rules/rule-filter.ts`(`filterForDocument`、`filterAndSummarize`) +- 机制:按文档语言对自定义规则做预过滤:处理 tsx/jsx 别名、sql/plsql 分组、JSP 子语言(java/javascript/typescript/css/html)展平。过滤后无相关规则时置位 `skippedRequestA`,跳过对应 AI 审查请求 +- 出处设计:`2026-07-23-rule-prefilter-design.md` +- 收益:减少送入 AI 提示词的规则数量(减小上下文),跳过无规则场景下的无效 AI 请求,同时降低过滤计算量 + +### 3.2 修复方案预生成与持久化(pregen-fix) + +- 实现位置:`src/fix/aiFixEngine.ts`(`aiFix` 预生成结果复用)、`src/fix/fixPending.ts`(`FixPendingStore`:singles / batches 持久化) +- 机制:AI 修复方案在审查阶段预生成并持久化(按文件+键存储,支持单条与批量),应用修复时直接执行文本替换(`aiFixEngine` 中按 `originalText/newText` 替换),无需再次调用 AI API +- 出处设计:`2026-08-22-pregen-fix-design.md` +- 收益:修复应用与预览路径免除重复 AI 调用,缩短交互链路延迟,并降低 API 成本 + +### 3.3 自定义规则导入去重判定 + +- 实现位置:`src/rules/converters/dedup-prompt.ts`(`buildDedupOnlyPrompt`)、`src/rules/import-service.ts` +- 机制:规则导入时通过提示词让 AI 为每条规则标注 `duplicateOf` / `duplicateLevel` / `duplicateReason`,导入阶段即完成与内置规则、既有自定义规则的查重 +- 收益:避免重复/重叠规则入库后在下游检查与报告中产生重复计算与重复报告(间接收益) + +### 3.4 debounce 防抖工具 + +- 实现位置:`src/utils/debounce.ts`(`debounce`) +- 机制:通用防抖函数(`setTimeout` 延后执行,窗口内连续触发只执行最后一次) +- 收益:用于高频事件(输入、文档切换等)的触发合并,减少无效的重复检查调度(间接收益) + +## 4. 界面与工程类优化 + +### 4.1 审查面板渲染优化(VSCode 主题适配) + +- 实现位置:`src/panel/webview.ts` +- 机制:将原型固定深色值映射为 VSCode CSS 变量(`--vscode-editor-background` 等),移除未完工的 diff / 撤销按钮区块,压缩渲染 DOM 结构 +- 出处设计:`2026-07-20-review-panel-optimization.md` +- 收益:面板在深/浅色双主题下无需重写样式;渲染 DOM 精简减少布局开销(间接收益) + +### 4.2 适配器三层配置模式 + +- 实现位置:`src/config/linter.ts`、`src/config/index.ts`;侧边栏面板 `src/views/setupView.ts` +- 机制:适配器配置按「默认配置 → 项目配置 → 用户配置」分层合并,配置读取后复用,变更时统一重载 +- 出处设计:`2026-07-27-adapter-optimization-design.md` +- 收益:配置读取路径统一,减少散落的重复读配置/解析;外部依赖与模板生成集中处理(间接收益) + +## 5. 收益汇总表 + +| 优化点 | 类型 | 关键实现文件 | 机制 | 收益 | +|--------|------|-------------|------|------| +| 静态分析结果缓存 | 缓存 | `src/orchestrator/orchestrator.ts` | uri 键缓存,多入口复用 | 消除同文档重复静态分析 | +| 方法级审查状态缓存 | 缓存 | `src/scope/status-cache.ts` | 文件+方法键缓存,文档关闭清理 | 减少 CodeLens 高频刷新重复计算 | +| PMD auxclasspath 缓存 | 缓存 | `src/services/auxClasspath.ts` | mtime 校验 + 并发合并 | classpath 构建仅在变更时执行 | +| AI Provider 缓存 | 缓存 | `src/ai/registry.ts` | 模块级缓存 + 显式失效 | 避免重复读盘解析 | +| 规则语言预过滤 | 流程 | `src/rules/rule-filter.ts` | 语言别名/分组/JSP 展平 | 减小 AI 上下文、可跳过无效请求 | +| 修复预生成持久化 | 流程 | `src/fix/aiFixEngine.ts`、`src/fix/fixPending.ts` | 审查阶段预生成并复用 | 免除修复路径重复 AI 调用 | +| 规则导入去重 | 流程 | `src/rules/converters/dedup-prompt.ts` | 导入时标注重复字段 | 避免重复规则下游重复处理(间接) | +| debounce 防抖 | 流程 | `src/utils/debounce.ts` | 高频事件合并 | 减少无效重复调度(间接) | +| 审查面板渲染优化 | UI | `src/panel/webview.ts` | 主题变量化 + DOM 精简 | 双主题兼容、布局开销降低(间接) | +| 适配器三层配置 | 工程 | `src/config/linter.ts` | 分层合并+统一重载 | 统一配置读取路径(间接) | + +## 6. 附录:出处索引 + +### 相关设计文档 + +- `docs/superpowers/specs/2026-07-20-review-panel-optimization.md` +- `docs/superpowers/specs/2026-07-23-rule-prefilter-design.md` +- `docs/superpowers/specs/2026-07-27-adapter-optimization-design.md` +- `docs/superpowers/specs/2026-07-28-provider-registry-dynamic-design.md` +- `docs/superpowers/specs/2026-08-22-pregen-fix-design.md` + +### 相关代码文件 + +- `src/orchestrator/orchestrator.ts` +- `src/scope/status-cache.ts` +- `src/views/codeLensProvider.ts` +- `src/services/auxClasspath.ts` +- `src/ai/registry.ts` +- `src/rules/rule-filter.ts` +- `src/fix/aiFixEngine.ts`、`src/fix/fixPending.ts` +- `src/rules/converters/dedup-prompt.ts` +- `src/utils/debounce.ts` +- `src/panel/webview.ts` +- `src/config/linter.ts`、`src/config/index.ts` \ No newline at end of file