当代码存在性能问题、执行缓慢、内存占用过高、嵌套循环过多、超时错误(timeout errors)、TLE(Time Limit Exceeded),或未能通过性能基准测试时,请使用本工具。 同样适用于算法复杂度分析、数据结构优化,或当用户提及 Big O、O(n²)、时间/空间复杂度、性能调优(performance tuning)、优化(optimize)、加速代码(speed up code)等场景,支持 C++、Java 和 Python。
代码优化器 技能
功能概述
代码优化器 技能是一项面向实际任务的技能,主要用于转换代码, 既减少时间和空间复杂度, 同时又保持正确性;聚焦到 C++, Java, 和 Python 的验证优化模式;
核心要点
- Core 原则。
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
使用与执行
该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
结果检查与注意事项
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
代码优化器技能
概述
在保持功能正确性的前提下,重构代码以降低时间与空间复杂度。重点关注 C++、Java 和 Python 中已被验证的优化模式。
核心原则:可量化地改善复杂度,并验证行为未发生变更。
适用场景
适用于所有与性能相关的工作:
- 运行缓慢、超时、内存问题
- 嵌套循环、重复查找
- 算法/数据结构选型
- 复杂度分析请求
尤其适用于以下情况:
- 用户明确提及“optimize”、“speed up”、“performance”等关键词
- 代码中存在 O(N²) 或更差的时间复杂度模式
- 竞赛编程中出现超时错误(TLE)
- 存在内存压力或 GC 开销过高的问题
快速参考表
| 症状 | 潜在问题 | 快速修复方案 |
|---|---|---|
| 对同一数据集进行嵌套循环 | O(N²) | 哈希表或双指针 |
| 在无序列表中执行查找 | 每次查找 O(N) | 转换为 set / hash |
| 在循环中拼接字符串 | O(N²) 内存抖动 | StringBuilder / reserve |
| 重复排序 | 每次排序 O(N log N) | 仅排序一次,缓存已排序结果 |
| 递归爆炸 | 指数级复杂度 | 记忆化 / 动态规划 |
| 未预分配容量的 vector 扩容 | 多次内存分配 | 预先调用 .reserve(N) |
优化工作流
每次优化均须严格遵循以下步骤:
优化进度: - [ ] 步骤 1:识别当前复杂度 - [ ] 步骤 2:分析瓶颈来源 - [ ] 步骤 3:选择优化策略 - [ ] 步骤 4:实施最小化变更 - [ ] 步骤 5:验证复杂度是否改善 - [ ] 步骤 6:确认行为未发生变化
步骤 1:识别当前复杂度
- 统计循环嵌套深度
- 识别数据结构操作(查找、插入、遍历)
- 计算最坏情况下的操作次数
- 以大 O 表示法表达
步骤 2:分析瓶颈来源
| 模式 | 典型瓶颈 |
|---|---|
| 对同一数据集进行嵌套遍历 | 双重循环导致 O(N²) |
| 在无序列表/数组中查找 | 每次查找 O(N) |
| 重复排序 | 每次排序 O(N log N) |
| 在循环中拼接字符串 | 因重复拷贝导致 O(N²) |
| 未使用记忆化的递归 | 指数级分支展开 |
| 在循环中创建大型对象 | 内存压力 + GC 开销 |
步骤 3:选择优化策略
参见下方「算法选型决策树」。
步骤 4:实施最小化变更
- 每次仅做一项变更
- 不进行捆绑式重构
- 不执行“顺手优化”类改进
步骤 5:验证复杂度是否改善
- 重新计算大 O 复杂度
- 确认是否达成预期优化目标
- 使用逐步增大的输入规模进行测试
步骤 6:确认行为未发生变化
- 运行全部现有测试用例
- 手动验证边界情况
- 对比优化前后的输出结果
算法选型决策树
digraph algorithm_selection {
rankdir=TB;
"Nested loops identified?" [shape=diamond];
"Lookup operation?" [shape=diamond];
"Hash Tablen(O(1) lookup)" [shape=box, style=filled, fillcolor="#ccffcc"];
"Range query?" [shape=diamond];
"Tree/Heapn(O(log N) query)" [shape=box, style=filled, fillcolor="#ccffcc"];
"Sliding pattern?" [shape=diamond];
"Two Pointers/Windown(O(N))" [shape=box, style=filled, fillcolor="#ccffcc"];
"Subproblem reuse?" [shape=diamond];
"DP/Memoizationn(Polynomial)" [shape=box, style=filled, fillcolor="#ccffcc"];
"Ordering needed?" [shape=diamond];
"Pre-sort oncen(O(N log N))" [shape=box, style=filled, fillcolor="#ccffcc"];
"Keep nested loopsn(document constraint)" [shape=box, style=filled, fillcolor="#ffcccc"];
"Nested loops identified?" -> "Lookup operation?";
"Lookup operation?" -> "Hash Tablen(O(1) lookup)" [label="yes"];
"Lookup operation?" -> "Range query?";
"Range query?" -> "Tree/Heapn(O(log N) query)" [label="yes"];
"Range query?" -> "Sliding pattern?";
"Sliding pattern?" -> "Two Pointers/Windown(O(N))" [label="yes"];
"Sliding pattern?" -> "Subproblem reuse?";
"Subproblem reuse?" -> "DP/Memoizationn(Polynomial)" [label="yes"];
"Subproblem reuse?" -> "Ordering needed?";
"Ordering needed?" -> "Pre-sort oncen(O(N log N))" [label="yes"];
"Ordering needed?" -> "Keep nested loopsn(document constraint)" [label="no - inherent O(N^2)"];
}
决策说明:
| 决策 | 条件 | 策略 | 效果 |
|---|---|---|---|
| 哈希表 | 需频繁执行查找操作 | 将列表查找替换为 set / map | O(N) → O(1) 每次查找 |
| 树 / 堆 | 需支持最小值 / 最大值 / 区间查询 | 采用有序数据结构 | O(N) → O(log N) 每次查询 |
| 双指针 | 存在连续区间模式 | 用双指针替代嵌套循环 | O(N²) → O(N) |
| 动态规划 / 记忆化 | 存在重复计算的子问题 | 缓存子问题结果 | O(2^N) → O(N) 或 O(N²) |
| 预排序 | 排序后可简化逻辑 | 仅排序一次,利用有序性 | 视具体场景而定 |
常见反模式汇总
| 反模式 | 检测信号 | 影响 | 修复方式 |
|---|---|---|---|
| 循环内对列表执行查找 | in list 出现在 for 循环内部 |
O(N²) | 改用 set() |
| 循环内拼接字符串 | 循环中对字符串使用 += |
O(N²) 内存开销 | 改用 StringBuilder |
| 未预留容量的增长操作 | 仅使用 push_back / append |
多次内存分配 | 显式调用 .reserve(N) |
| 循环内重复排序 | sort() 出现在循环内部 |
每次排序 O(N log N) | 移至循环外,仅排序一次 |
| 递归爆炸 | 存在递归调用且无记忆化 | O(2^N) | 引入记忆化 |
完整反模式详情:参见 references/anti-patterns.md
优化模式库:参见 references/optimization-patterns.md
完整示例:参见 references/examples.md
复杂度公式:参见 references/complexity-formulas.md
语言特异性速查提示
| 语言 | 关键优化点 |
|---|---|
| C++ | reserve()、unordered_map、移动语义、std::span、基于范围的算法 |
| Java | 带容量参数的 StringBuilder、原始类型流(IntStream)、ArrayDeque |
| Python | 列表推导式、collections 模块、生成器、成员判断优先使用 set() |
危险信号 — 立即暂停并深入调查
若你发现自己产生如下想法,请立即停止:
- “只要让它更快就行”,却未进行任何测量
- “这个优化很明显”,却未做任何分析
- “测试仍能通过,所以没问题”,却未检查复杂度变化
- “我稍后再优化”,但该代码处于热点路径(hot path)
- 完成优化后跳过验证环节
以上任一情形出现,均意味着:立即暂停。严格遵循既定工作流。
常见借口辨析
| 借口 | 事实 |
|---|---|
| “问题很简单,无需分析” | 简单问题同样有其根本原因。务必先做计算与分析。 |
| “先试试这个修复方法” | 首次修复会确立后续模式。必须从一开始就做对。 |
| “测试通过,说明优化有效” | 测试通过 ≠ 复杂度得到改善。必须实测验证。 |
| “同时应用多个优化” | 无法定位真正起效的变更项。每次仅允许一项变更。 |
| “我稍后再做测量” | 测量是证明优化有效的唯一依据。必须立刻执行。 |
不应优化的情形
- 代码已达到 O(N) 或 O(N log N),且性能表现可接受
- 在原型开发或探索阶段进行过早优化
- 虽已识别热点路径,但尚未开展实际性能测量
- 问题本身具有固有复杂度(例如:必须检查所有数对)
决策逻辑:何时需要主动提问
切勿对关键性能代码凭空猜测约束条件。应主动询问:
- “最大输入规模是多少?”
- “这是对延迟敏感还是对吞吐量敏感?”
- “是否存在需要考虑的内存限制?”
- “目标时间/空间复杂度是什么?”
性能验证
在宣称优化成功之前,必须完成以下验证:
各语言性能剖析命令:
C++:
g++ -O2 -pg solution.cpp -o solution ./solution input.txt gprof solution gmon.out > analysis.txt
Java:
java -Xprof Solution
Python:
python -m cProfile -s tottime solution.py
伸缩性测试(Scaling test):
for size in 100 1000 10000 100000; do
time ./solution input_${size}.txt
done
# 预期:O(N) 应呈线性增长;O(N log N) 应呈近似线性对数增长
# 警告:若输入规模翻倍导致耗时增至约四倍,则表明仍为 O(N²)
热门AI工具
相关专题
Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。
0
2026.10.28
Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。
0
2026.10.28
Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。
0
2026.10.28
本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。
0
2026.10.22
本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。
0
2026.10.22
本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。
0
2026.10.22
本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。
0
2026.10.22
本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。
0
2026.10.22
本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。
0
2026.10.22
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.6万人学习
共6课时 | 54.7万人学习
最新文章