用途
Code Perf 是一个性能分析与优化工作流技能,适用于代码运行缓慢、存在内存问题或需要性能优化的场景。当出现“slow”“performance”“optimize”“memory”等触发词时,该技能可提供系统化的性能调优指导。
核心原则
该技能强调一条黄金法则:没有分析就不优化。在未测量瓶颈位置之前进行修改会浪费时间,甚至可能使情况恶化。因此,工作流始终从性能分析开始。
工作流程
-
分析(Profile):测量当前性能。需要回答的问题包括:什么慢(端点、操作、页面加载)?有多慢(延迟、吞吐量)?在什么条件下(负载、数据量)?常用工具包括浏览器 DevTools 的 Performance 面板、Node clinic.js、Python cProfile、Go pprof。
-
识别(Identify):找到热点路径。关注被多次调用的函数、大量内存分配、阻塞 I/O、不必要的计算。
-
优化(Optimize):应用合适的优化模式。
-
验证(Verify):重新分析以确认改进效果。
常见瓶颈
技能整理了常见瓶颈模式及其症状与解决方案:
- N+1 查询:症状为多次数据库查询,解决方案是预加载、批量处理。
- 内存泄漏:症状为 RSS 持续增长,解决方案是清理缓存、使用弱引用。
- 阻塞 I/O:症状为线程阻塞,解决方案是异步、工作线程池。
- 不必要的工作:症状为 CPU 占用高,解决方案是跳过冗余计算。
- 大数据:症状为序列化缓慢,解决方案是分页、流式处理。
优化模式
技能提供了多种优化模式的代码示例:
缓存:在数据库查询前先检查 Redis 缓存,未命中再查询数据库并写入缓存。
懒加载:将一次性加载全部数据改为分页加载,例如使用 take 和 skip 参数。
连接池:避免每次新建连接,改用连接池(如 max: 20)并复用 pool.query()。
性能分析工具
技能列出了各语言的常用分析命令:
Node.js:
- CPU 分析:
node --prof app.js - 内存:
node --inspect app.js(Chrome DevTools) - clinic.js:
npx clinic doctor -- node app.js
Python:
- cProfile:
python -m cProfile -o profile.prof app.py - 查看:
python -m cProfile -s cumulative app.py
Go:
- pprof:
go test -cpuprofile=cpu.prof go tool pprof cpu.prof- Web 界面:
go tool pprof -http=:8080 cpu.prof
技能加载建议
如果优化涉及查询,可加载 python-sqlalchemy 或 typescript-drizzle-orm;如果涉及内存问题,可加载堆快照相关技能;如果涉及数据库,可加载相应的数据库技能。
适用场景与限制
该技能适用于后端服务、数据库查询、内存管理等性能调优场景,提供的是工作流指导和常见模式参考。具体优化效果取决于实际代码和运行环境,技能本身不保证特定性能提升数值。部分引用文件(如 references/common-bottlenecks.md、references/optimization-patterns.md、references/profiling-tools.md)的具体内容在提供的资料中未完整展开。