Performance Optimization 是一个面向 AI 智能体的技能,用于在性能是明确目标或明显风险时指导代码优化。其目标是在不改变可观察行为的前提下,让代码运行得更快或更轻量,并在可行时通过测量验证改进效果。
用途
该技能适用于任务涉及延迟、吞吐量、内存、CPU、启动时间、构建时间、I/O、数据库负载、并发或可扩展性等性能议题的场景。性能被视为一等设计约束,但正确性、安全性和可维护性仍然划定边界。在同样清晰的情况下优先选择高效方案;侵入式重写、取巧的微优化和额外复杂度应保留给经过测量的热点路径或高风险工作负载。
激活条件
当任务包含以下情况时使用该技能:出现 optimize、speed up、slow、bottleneck、latency、throughput、memory、allocation、CPU、hot path、scalability、benchmark、profile、N+1、cache、concurrency 等明确的性能术语;代码频繁运行、处理大数据、位于请求/构建/渲染循环中,或执行重复的 I/O 或数据库操作;审查实现时算法复杂度、过多分配、阻塞 I/O、无界并发或资源泄漏可能带来实际成本;在原本相似的实现之间选择,而其中一个明显更高效且不会对可读性或正确性造成实质损失。
以下情况不应将该技能作为主要视角:用户只要求格式化、命名、文档、产品文案或风格清理;代码是一次性设置、迁移、测试夹具生成或管理脚本且未提及性能问题;某项改动会为了推测性的速度而牺牲正确性、安全性、可访问性、兼容性或明确的仓库约定;仓库已有功能性缺陷且没有证据表明性能是根因。
前置输入与前提
优化前应尽可能收集:性能目标或症状(目标延迟、吞吐量、内存上限、CPU 限制、超时、构建时长或用户可见的变慢);工作负载形态(输入规模、调用频率、数据分布、并发级别、环境,以及该路径是 CPU 密集还是 I/O 密集);基线(分析器输出、基准结果、日志、查询计划、追踪、火焰图、复现步骤或可在本地运行的小型基准);必须继续通过的正确性要求和现有测试;仓库约束(语言/运行时版本、框架约定、支持平台、依赖和部署限制)。如果没有基线,在可行时创建聚焦的测量;如果无法测量,说明假设并选择由复杂度分析或明显冗余工作支撑的低风险改动。
优化工作流
定义指标:明确什么应改善、什么不得回退。找到热点路径:使用分析、追踪、查询计划、日志或与工作负载频率相关的代码检查。保持行为:在改动高风险逻辑前运行或添加聚焦的正确性测试。选择最高杠杆的修复:优先算法改进、批处理、减少分配、流式处理、索引、缓存或有界并发,而非表面微调。保持改动范围狭窄:只优化瓶颈,不做大范围重写或无关重构。再次测量:用相同工作负载比较前后数值,或说明为何只能做静态验证。记录权衡:注明优化引入的复杂度、缓存失效、并发限制或环境假设。
主要能力(按主题)
-
循环与迭代:每个循环都是成本乘数,应尽量减少循环内的工作。不要在循环内重复计算不变量,将常量表达式、长度和查找提升到循环外;能用哈希映射或索引单次遍历时避免嵌套循环;优先使用语言原生的批量操作;尽早中断;融合循环;避免在循环内分配对象、字符串或数组。
-
变量与临时值:每个变量都消耗寄存器或栈槽。消除不必要的临时变量;不要赋值从不读取的变量;表达式清晰时优先直接返回而非先赋临时变量再返回;复用累加器而非构建立即丢弃的中间集合。
-
内存与分配:分配代价高昂,最快的分配是从未发生的分配。已知或可估计大小时预分配集合;为重复操作复用缓冲区;生命周期限于当前作用域时优先栈分配;避免装箱;在高频短生命周期分配的性能关键路径使用对象池或 arena;优先视图/切片而非复制子数组或子串;尽早释放引用;选择合适的数据结构容量。
-
算法与数据结构:最大的性能收益来自选择正确算法。写方案前说明时间和空间的 Big-O;成员测试和键查找使用基于哈希的查找;只在需要时排序并选择正确排序;使用合适的数据结构(双端队列、堆、前缀树、位集);缓存昂贵计算,对重复输入的纯函数使用记忆化;避免冗余计算。
-
字符串操作:字符串的代价具有欺骗性。多步拼接使用字符串构建器/缓冲区,尤其不要在循环中用 + 拼接;优先插值或格式化;避免重复解析;在可用时先比较标识再比较相等;不需要 Unicode 语义时使用字节级操作。
-
I/O 与网络:I/O 比计算慢几个数量级。批量数据库查询,绝不在循环内查询(N+1 问题);缓冲 I/O;减少网络往返;大负载使用流式处理;使用连接池;设置合适超时;对大型结果集分页。
-
并发与并行:I/O 密集工作用并发,CPU 密集工作用并行。识别独立操作并并发运行;对可重叠的网络调用、文件读取和数据库查询使用异步 I/O;用线程池、工作池或并行流跨核并行 CPU 密集工作,但仅在工作负载足以抵消开销时;避免共享可变状态;用有界并发批量处理并发工作;注意缓存行伪共享。
-
惰性求值与短路:不要计算不会用到的内容。消费者可能不需要全部结果时使用惰性求值;按成本和可能性排列条件;延迟昂贵初始化;查询中使用分页和限制。
-
缓存:最快的计算是已经做过的计算。输入重复时缓存纯函数结果;使用合适的缓存淘汰策略防止内存无界增长;在正确层级缓存;正确失效;缓存前先分析,只缓存真正昂贵的内容。
-
数据序列化与反序列化:解析和格式化是每个边界的隐藏税。选择正确格式,内部服务通信优先二进制格式;只序列化一次;大负载使用流式解析器;避免重复序列化;性能关键路径优先模式驱动序列化而非基于反射的序列化;注意编码成本;选择性反序列化。
-
错误处理:异常代价高昂,绝不用作控制流。不要为预期情况抛异常;避免在热循环中使用 try/catch;优先守卫子句;在允许的语言中为已知错误类型禁用堆栈跟踪;性能关键代码使用错误值模式。
-
日志与可观测性:日志是隐形开销。保护昂贵的日志消息,日志级别禁用时不要构造消息字符串;除非在 TRACE/DEBUG 级别且有级别检查保护,否则不要在紧凑循环内记录日志;使用结构化日志;高吞吐路径使用异步/缓冲日志;避免记录大对象;对高频事件采样。
适用场景
适用于性能是明确目标或明显风险的代码优化任务,包括延迟、吞吐量、内存、CPU、启动时间、构建时间、I/O、数据库负载、并发和可扩展性等场景;也适用于审查可能因算法复杂度、过多分配、阻塞 I/O、无界并发或资源泄漏而产生实际成本的实现。
限制
该技能不适用于仅要求格式化、命名、文档、产品文案或风格清理的任务;不适用于一次性设置、迁移、测试夹具生成或管理脚本且未提及性能问题的情况;不应为推测性速度而牺牲正确性、安全性、可访问性、兼容性或仓库约定;当仓库已有功能性缺陷且无证据表明性能是根因时,不应将其作为主要视角。若无法测量,需说明假设并选择低风险改动。