mcpField
C
code-optimization

code-optimization

github.com/bytedance开发477110 次安装今天更新
代码仓库

关于 code-optimization

Code Optimization Skill 面向需要提升程序性能的开发者,通过基准测试、正确性验证和最多两轮优化,比较优化实现与基线,并生成报告。

主要功能

  1. 01分析代码并定位性能瓶颈
  2. 02测量执行时间与内存用量
  3. 03与基线实现比较性能
  4. 04验证正确性并检查边界情况
  5. 05保存优化代码并生成报告

适用场景

  1. 01优化现有代码的运行性能
  2. 02比较实现与标准库基线
  3. 03记录代码优化前后的指标
  4. 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)
  • 零拷贝:避免不必要的数据重复

最佳实践

  1. 先测量:优化前务必对基准性能进行基准测试
  2. 验证正确性:将优化后的代码与参考实现进行测试
  3. 渐进式修改:一次优化一个方面,以便单独评估改进效果
  4. 记录所有内容:在报告中记录每次优化尝试
  5. 考虑权衡:平衡性能、内存和代码复杂度
  6. 关注平台:在目标硬件(CPU 架构、缓存大小)上进行测试
  7. 编译器优化:使用合适的标志,但要了解其作用
  8. 基于性能分析:使用性能分析工具(perf、valgrind)找出瓶颈
  9. 遵守迭代次数限制:策略性地规划 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