Complexity Optimizer 是一个面向软件代码库的算法复杂度与性能热点分析技能,目标是在不破坏现有行为的前提下提出或实施安全优化。
核心规则
只有在理解当前行为且能够保留该行为时才进行优化。优先选择有测试保障的小幅、经过验证的改进,而不是正确性不明的广泛重写。
默认行为
当用户要求分析、扫描、审计、审查或“给我一份报告”时,自动生成完整的复杂度报告,不要求用户指定报告字段。默认报告内容包括:分析范围与检测到的技术栈/测试命令;按可能影响排序的主要发现;每个发现的文件与行号;当前模式及其可能代价高昂的原因;当前复杂度估算;建议的修改;修改后的复杂度估算;风险等级;所需的测试、基准或人工检查;以及明确声明未修改任何文件(除非用户明确要求实施)。
仅当用户要求实施、修复、优化、应用、更改、重构或以其他方式明确请求修改代码时才编辑文件。如果用户仅要求分析或报告,则不修改文件。
工作流程
建立基线:识别语言、框架、测试命令、构建命令和性能敏感路径;在接触代码前检查现有测试;扫描仓库时运行 scripts/analyze_complexity.py <repo> 获取第一轮热点列表。
排序机会:优先处理热路径、大输入路径、渲染循环、数据库/API 循环和共享工具上的代码;将算法复杂度与常数因子清理区分开;不要修补每一个警告,将扫描器输出视为线索而非证据;对于仅报告请求,检查足够的周边代码以估算当前和建议的复杂度,不要止步于原始扫描器输出。
证明行为:定位或添加针对被修改函数/组件的聚焦测试;捕获边界情况,包括空输入、重复项、排序稳定性、空/缺失值、错误、权限、分页、时区和变更副作用;如果测试缺失且行为不明确,进行最小重构或在更改语义前询问预期行为。
保守优化:当键相等性稳定时,用映射/集合替换重复的线性查找;仅当数据形态支持时,用索引、分组、双指针扫描、扫描线逻辑、二分查找、记忆化、批处理或预计算替换嵌套扫描;在 UI 代码中,通过稳定 props、记忆化派生数据、虚拟化、防抖以及将昂贵工作移出渲染路径来减少不必要的渲染;在数据访问代码中,通过批量获取、连接、预加载、缓存或批处理消除 N+1 行为,同时保留授权和过滤。
验证:运行相关测试和类型/检查/构建命令;当复杂度改进不明显或性能关键时,添加微基准或测量;报告原始复杂度、新复杂度、更改的文件、运行的测试以及任何残余风险。
第一轮扫描器
使用技能目录中捆绑的扫描器:
python3 scripts/analyze_complexity.py /path/to/repo --format markdown python3 scripts/analyze_complexity.py /path/to/repo --format json
该扫描器会标记 Python、JavaScript、TypeScript、JSX/TSX、Java、Go、C、C++、C#、Ruby、PHP 和 Swift 文件中的常见模式。它有意偏向可读的线索,而非完美的静态分析。如果扫描器没有报告任何内容,仍应手动检查已知热路径。渲染抖动、数据库查询模式和框架生命周期问题通常需要仓库特定的上下文。
优化安全清单
编辑前:确认数据规模足够大,使复杂度变得重要;确认优化在调用方可能依赖输出顺序时保留输出顺序;确认对象标识、可变性和引用共享不属于公共行为;确认缓存具有有效的失效策略;确认去重不会合并共享显示标签的不同记录;确认数据库批处理保留租户、权限、软删除、分页和排序约束。
编辑后:先运行窄范围测试,再运行最广泛的相关测试/构建命令;当存在或添加了基准时,比较前后基准数值;保持补丁局部化,避免无关文件的格式变动。
参考资料
阅读 references/optimization-playbook.md 了解常见的 O(n^2) 到 O(n log n) / O(n) 转换以及框架特定模式。准备最终分析或审计输出时,阅读 references/report-template.md。