code-optimizer-skill

Polar Sponsor
爱发电 赞助
.NET 9.0

当代码存在性能问题、执行缓慢、内存占用过高、嵌套循环过多、超时错误(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²)

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

0

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

0

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习