name: performance-profiler description: 识别性能瓶颈,包括N+1查询、低效循环、内存泄漏和慢速算法。当用户提到性能问题、代码缓慢、优化或性能分析时使用。 allowed-tools: Read, Grep, Glob
性能分析器
识别并建议修复代码中常见的性能瓶颈。
使用时机
- 用户报告性能问题或代码缓慢
- 优化请求
- 代码审查以提升性能
- 用户提及“慢”、“瓶颈”、“优化”、“内存泄漏”
使用说明
1. 识别性能反模式
N+1查询问题:
// 差:N+1次查询
users.forEach(user => {
const posts = db.query('SELECT * FROM posts WHERE user_id = ?', user.id);
});
// 好:使用JOIN的单次查询
const usersWithPosts = db.query('SELECT * FROM users LEFT JOIN posts ON users.id = posts.user_id');
低效循环:
# 差:O(n²)嵌套循环
for item in list1:
for other in list2:
if item.id == other.id:
process(item, other)
# 好:使用哈希映射实现O(n)
lookup = {other.id: other for other in list2}
for item in list1:
if item.id in lookup:
process(item, lookup[item.id])
不必要的重新渲染(React):
// 差:每次渲染都创建新对象
<Component style={{ margin: 10 }} />
// 好:在外部定义或使用useMemo
const style = { margin: 10 };
<Component style={style} />
内存泄漏:
- 未清理的事件监听器
- 未清除的定时器
- 循环引用
- 无限增长的大型缓存
阻塞操作:
- 同步文件I/O
- UI线程中的长时间计算
- 缺少分页
2. 数据库性能
检查:
- 外键上缺少索引
- 使用SELECT *而非指定列
- 循环中的查询(N+1)
- 缺少查询限制
- 低效的JOIN操作
建议:
- 添加索引:
CREATE INDEX idx_user_id ON posts(user_id); - 使用预加载/预取
- 实现分页
- 使用数据库查询分析器(EXPLAIN)
3. 算法复杂度
识别:
- O(n²)或更差的算法
- 冗余计算
- 不必要的排序
- 低效的数据结构
常见修复:
- 使用哈希映射实现O(1)查找,替代O(n)数组搜索
- 二分查找O(log n)替代线性查找O(n)
- 对重复计算使用记忆化
- 对昂贵操作使用惰性求值
4. 前端性能
检查:
- 过大的包体积
- 未优化的图片
- 缺少代码分割
- 低效的React组件
- 缺少记忆化
建议:
- 懒加载:
const Component = lazy(() => import('./Component')); - 图片优化
- 对昂贵操作进行防抖/节流
- 长列表使用虚拟滚动
- 繁重计算使用Web Workers
5. 网络性能
问题:
- HTTP请求过多
- 负载过大
- 缺少缓存
- 同步请求
解决方案:
- 打包/合并资源
- 实现压缩(gzip, brotli)
- 使用HTTP/2多路复用
- 添加缓存头
- 并行请求替代串行请求
6. 生成性能报告
性能分析
===================
关键问题(立即修复):
1. UserController.index中的N+1查询 (file.js:45)
- 影响:每个请求产生100+次数据库查询
- 修复:使用预加载或JOIN
2. EventEmitter中的内存泄漏 (file.js:120)
- 影响:内存无限增长
- 修复:在清理时移除监听器
高优先级:
3. processData中的O(n²)循环 (file.js:200)
- 影响:大数据集下速度缓慢
- 修复:使用哈希映射实现O(n)
中优先级:
4. 缺少图片优化
- 影响:页面加载缓慢
- 修复:使用next/image或手动优化
7. 性能分析工具
JavaScript:
- Chrome DevTools性能面板
- Node.js --inspect标志
console.time()/console.timeEnd()
Python:
- cProfile模块
- line_profiler
- memory_profiler
数据库:
- EXPLAIN / EXPLAIN ANALYZE
- 慢查询日志
- pg_stat_statements (PostgreSQL)
最佳实践
- 优化前先进行性能分析
- 关注热点路径(80/20法则)
- 测量变更的影响
- 权衡可读性与性能
- 记录性能关键部分