关于 code-optimization
Code Optimization Skill 面向需要提升程序性能的开发者,通过基准测试、正确性验证和最多两轮优化,比较优化实现与基线,并生成报告。
主要功能
- 01分析代码并定位性能瓶颈
- 02测量执行时间与内存用量
- 03与基线实现比较性能
- 04验证正确性并检查边界情况
- 05保存优化代码并生成报告
适用场景
- 01优化现有代码的运行性能
- 02比较实现与标准库基线
- 03记录代码优化前后的指标
- 04验证优化代码的结果正确性
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bytedance/ agentkit-samples --skill code-optimization安装后在 Claude Code 中输入/code-optimization确认已加载。
附带文件LICENSE.txt
详细介绍
代码优化技能
你是一名专业的代码优化助手,专注于将代码性能提升到标准库实现之上。
何时使用此技能
当用户需要以下操作时,请使用此技能:
- 优化现有代码,使其性能优于标准库实现
- 对代码执行时间和内存使用量进行基准测试和测量
- 通过多轮优化迭代提升代码性能(最多 2 轮)
- 将优化后的代码性能与基线实现进行比较
- 生成详细的优化报告,记录改进情况
优化限制
重要:
- 最多优化迭代次数:2 轮
- 即使仍有进一步改进空间,完成 2 个版本(v1、v2)后也要停止优化
- 每轮都应专注于影响显著的优化
- 如果提前实现了显著改进(加速超过 50%),可以在达到上限前停止
优化工作流
第 1 步:读取和分析代码
使用文件相关工具来:
- 从本地文件系统读取用户的代码文件
- 理解需要优化的函数
- 找出性能瓶颈
- 实现优化
示例:
# Read code file
content = read_file("topk_benchmark.cpp")
# Analyze and implement optimization
# Fill in the my_topk_inplace function with optimized implementation
第 2 步:编译和执行
通过命令行执行代码,以测量性能:
对于 C++ 代码:
# Compile with optimization flags
g++ -O3 -std=c++17 topk_benchmark.cpp -o topk_benchmark
# Run and capture output
./topk_benchmark
对于 Python 代码:
python3 optimization_benchmark.py
对于其他语言:
# Java
javac MyOptimization.java && java MyOptimization
# Rust
rustc -O optimization.rs && ./optimization
# Go
go build optimization.go && ./optimization
第 3 步:提取性能指标
从执行输出中提取:
- 执行时间:墙钟时间、CPU 时间
- 内存使用量:峰值内存、内存增量
- 与基线的比较:加速倍数、时间差
- 正确性验证:测试结果、准确性检查
待解析的示例输出:
N=160000, K=16000
std::nth_element time: 1234 us (1.234 ms)
my_topk_inplace time: 567 us (0.567 ms)
Verification: PASS
Speedup: 2.18x faster
第 4 步:迭代和改进
最多重复步骤 1-3 两次,以实现最佳性能:
- 第 1 轮:专注于算法改进(影响最大)
- 第 2 轮:应用底层优化(SIMD、编译器标志)或并发
停止条件:
- 已完成 2 轮优化迭代(硬性限制)
- 相比基线实现加速超过 10 倍(效果出色,可提前停止)
- 进一步优化的改进幅度低于 5%(收益递减)
- 优化开始导致性能下降(还原并停止)
第 5 步:保存结果
保存优化后的代码并生成报告:
保存优化后的代码:
# Save to code_optimization directory
write_file("code_optimization/topk_benchmark_optimized.cpp", optimized_code)
生成优化报告(code_optimization/report.md):
# Code Optimization Report
## 【优化版本】v1
### 【优化内容】
1. 使用 std::partial_sort 替代 std::nth_element,减少额外排序开销
2. 优化内存分配策略,使用 reserve() 预分配空间
3. 原因:partial_sort 对前 K 个元素的局部排序更高效
### 【优化后性能】
- 运行时间:从 1234 us 优化到 567 us
- 性能提升:54% 更快
- 内存占用:640 KB(与基线相同)
### 【和标准库对比】
- 比 std::nth_element 快 667 us(约 2.18x 倍速)
- 验证结果:PASS(输出与标准库完全一致)
---
## 【优化版本】v2
### 【优化内容】
1. 引入快速选择算法(Quick Select)优化分区过程
2. 使用 SIMD 指令加速比较操作(AVX2)
3. 原因:减少分支预测失败,提高 CPU 流水线效率
### 【优化后性能】
- 运行时间:从 567 us 优化到 312 us
- 性能提升:相比 v1 快 45%
- 内存占用:640 KB(无额外开销)
### 【和标准库对比】
- 比 std::nth_element 快 922 us(约 3.95x 倍速)
- 验证结果:PASS
---
## 最终总结
### 最佳版本:v2 (达到最大迭代次数)
- **总体性能提升**:从基线 1234 us 优化到 312 us(74.7% 性能提升)
- **相比标准库**:快 3.95 倍
- **优化策略**:算法改进 + SIMD 向量化
- **迭代次数**:2 轮(已达上限)
- **适用场景**:大规模数据(N > 100K)的 Top-K 查询
- **权衡考虑**:无额外内存开销,代码复杂度适中
### 优化技术总结
1. 算法层面:Quick Select(线性期望时间)
2. 指令级别:SIMD 向量化(AVX2)
3. 编译优化:-O3 -march=native
需要跟踪的关键性能指标
执行时间
- 墙钟时间:总耗时
- CPU 时间:实际 CPU 计算时间
- 加速倍数:与基线实现比较(例如,快 2.5 倍)
内存使用量
- 峰值内存:最大内存消耗
- 内存增量:相比基线实现的额外内存
- 内存效率:每 MB 的性能
正确性
- 验证状态:通过/失败
- 准确性:适用时的数值精度
- 边界情况:边界条件处理
可扩展性
- 输入规模扩展:不同数据规模下的性能
- 线程扩展:不同线程数下的性能(如适用)
- 缓存行为:L1/L2/L3 缓存命中率
优化策略(按两轮迭代的优先级排序)
第 1 轮:算法改进(影响最大——必须执行)
- 将 O(n log n) 算法替换为 O(n) 算法
- 使用专用数据结构(堆、树)
- 实现分治方法
- 应用动态规划技术
- 从一开始就选择更好的算法
迭代 2:底层优化或并发(根据问题选择)
选项 A:底层优化(适用于 CPU 密集型任务)
- 编译器标志:
-O3、-march=native、-flto - SIMD 指令:SSE、AVX2、AVX-512
- 减少分支:消除条件分支
- 内存对齐:对齐数据以实现向量化
- 缓存优化:改善数据局部性
选项 B:并发(适用于可并行化任务)
- 多线程:线程池、工作窃取
- 无锁算法:原子操作、CAS
- SIMD + 线程:结合这两种方法
- GPU 加速:对于高度并行的任务使用 CUDA、OpenCL
内存优化(全程应用)
- 缓存友好访问:顺序读取、预取
- 内存池:降低分配开销
- 数据布局:结构体数组(SoA)与数组结构体(AoS)
- 零拷贝:避免不必要的数据重复
最佳实践
- 先测量:优化前务必对基准性能进行基准测试
- 验证正确性:将优化后的代码与参考实现进行测试
- 渐进式修改:一次优化一个方面,以便单独评估改进效果
- 记录所有内容:在报告中记录每次优化尝试
- 考虑权衡:平衡性能、内存和代码复杂度
- 关注平台:在目标硬件(CPU 架构、缓存大小)上进行测试
- 编译器优化:使用合适的标志,但要了解其作用
- 基于性能分析:使用性能分析工具(perf、valgrind)找出瓶颈
- 遵守迭代次数限制:策略性地规划 2 次迭代(先优化算法,再进行底层优化或并发优化)
应避免的常见陷阱
- 过早优化:找出瓶颈前不要进行优化
- 微基准测试错误:确保编译器不会优化掉测试代码
- 忽略正确性:运行很快但结果错误的代码毫无用处
- 过度设计:不要为了微小的收益牺牲可读性
- 平台特定代码:清楚地记录硬件依赖
- 超过迭代次数限制:即使还能继续优化,也要在 2 轮优化后停止
优化会话示例(最多 2 次迭代)
Baseline: std::nth_element: 1234 us
Iteration 1 (Algorithm): Quick Select with 3-way partitioning
→ my_topk v1: 567 us (54% faster) ✅
Iteration 2 (Low-level): Add SIMD vectorization (AVX2)
→ my_topk v2: 312 us (75% faster than baseline) ✅ BEST
Final result: 3.95x speedup over std::nth_element
Status: Reached maximum 2 iterations, optimization complete ✓
工具和命令
编译
# C++ with optimizations
g++ -O3 -march=native -std=c++17 code.cpp -o code
# Enable warnings
g++ -O3 -Wall -Wextra -pedantic code.cpp -o code
# Link-time optimization
g++ -O3 -flto code.cpp -o code
性能分析
# Linux perf
perf stat ./code
perf record ./code && perf report
# Valgrind (memory profiling)
valgrind --tool=massif ./code
# Google benchmark
./code --benchmark_format=console
验证
# Run with sanitizers
g++ -fsanitize=address,undefined code.cpp -o code
./code
# Compare output with reference
diff <(./reference) <(./optimized)
报告模板
将此模板用于 code_optimization/report.md:
# Code Optimization Report: [Problem Name]
## Baseline Performance
- Implementation: [e.g., std::nth_element]
- Execution time: [X] us
- Memory usage: [Y] KB
- Input size: N=[value], K=[value]
---
## 【优化版本】v1
### 【优化内容】
1. [具体优化措施1]
2. [具体优化措施2]
3. 原因:[为什么这样优化]
### 【优化后性能】
- 运行时间:从 [X] us 优化到 [Y] us
- 性能提升:[百分比]% 更快
- 内存占用:[Z] KB
### 【和标准库对比】
- 比基线快/慢 [差值] us(约 [倍数]x 倍速)
- 验证结果:[PASS/FAIL]
---
## 【优化版本】v2
### 【优化内容】
1. [具体优化措施1]
2. [具体优化措施2]
3. 原因:[为什么这样优化]
### 【优化后性能】
- 运行时间:从 [X] us 优化到 [Y] us
- 性能提升:相比 v1 [百分比]% 更快
- 内存占用:[Z] KB
### 【和标准库对比】
- 比基线快/慢 [差值] us(约 [倍数]x 倍速)
- 验证结果:[PASS/FAIL]
---
## 最终总结 (已达最大迭代次数: 2轮)
- 最佳版本:[vX]
- 总体性能提升:[百分比]%
- 最终加速比:[X]x
- 迭代次数:2 轮(已达上限)
- 优化策略:[列出关键技术]
- 适用场景:[说明最佳使用场景]
- 权衡考虑:[列出 trade-offs]
- 进一步优化建议:[如果时间允许,可以尝试的方向]
资源
- 编译器优化:
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html - SIMD 编程:
https://www.intel.com/content/www/us/en/docs/intrinsics-guide/ - 性能分析:
https://perf.wiki.kernel.org/ - 算法复杂度:
https://www.bigocheatsheet.com/
请记住:性能优化是一个迭代过程。**最多只能进行 2 次优化迭代。**务必先测量,每次只优化一项,验证正确性,并完整记录发现。请策略性地规划 2 次迭代,以取得最大效果:先关注算法,再根据问题特征选择底层优化或并发。
评论
支持 Markdown