名称: phx:perf 描述: 分析Elixir/Phoenix代码的性能问题 — N+1查询、LiveView内存、查询模式、OTP瓶颈。在优化或性能分析时使用。 参数提示: [页面|上下文|模块] [–focus ecto|liveview|otp] 禁用模型调用: true
性能分析
分析代码在Ecto、LiveView和OTP层的性能问题。按影响和努力程度优先处理发现。
用法
/phx:perf # 分析整个项目
/phx:perf lib/my_app/accounts.ex # 分析特定模块
/phx:perf --focus ecto # 仅分析Ecto查询
/phx:perf --focus liveview # 仅分析LiveView内存
/phx:perf --focus otp # 仅分析OTP瓶颈
参数
$ARGUMENTS = 可选的模块/上下文路径和--focus标志。
铁律
- 优化前先测量 — 没有证据表明问题前绝不优化
- 数据库优先 — 90%的Elixir性能问题与查询相关
- 一次一个更改 — 隔离优化以测量影响
工作流程
步骤1: 确定范围
如果提供特定文件,则聚焦于此。否则:
# 查找热点路径:上下文、LiveViews、工作者
find lib/ -name "*.ex" | head -50
步骤2: 运行分析轨道
基于焦点并行启动分析代理:
Ecto轨道(默认或--focus ecto):
启动elixir-phoenix:elixir-reviewer,提示:
“分析N+1查询、缺失预加载、未索引查询和低效模式。检查:循环中的Repo.all、带Repo调用的Enum.map、缺失preload、WHERE/JOIN列上无索引的查询。”
LiveView轨道(默认或--focus liveview):
启动elixir-phoenix:elixir-reviewer,提示:
“分析LiveView内存问题:大型分配、列表缺失流、无界增长的分配、繁重的handle_info处理、慢操作缺失assign_async。”
OTP轨道(仅--focus otp时):
启动elixir-phoenix:otp-advisor,提示:
“分析OTP瓶颈:GenServer邮箱增长、热路径中的同步调用、并行工作缺失Task.async、读密集型状态的ETS机会。”
步骤3: 优先处理发现
在2x2矩阵中为每个发现评分:
| 低努力 | 高努力 | |
|---|---|---|
| 高影响 | 优先执行 | 计划 |
| 低影响 | 快速胜利 | 跳过 |
高影响 = 影响响应时间、每个用户的内存或查询数量。 低努力 = 单个文件更改,无需迁移。
步骤4: 呈现前5名
按优先级排序呈现发现:
## 性能分析: {范围}
### 1. {发现} — 优先执行
**影响**: {改进内容}
**位置**: {文件}:{行号}
**当前**: {问题模式}
**修复**: {优化模式}
**预计收益**: {例如,"消除N+1,将查询从O(n)减少到O(1)"}
### 2. {发现} — 计划
...
步骤5: 提供后续步骤
您希望如何继续?
- `/phx:plan` — 规划优化
- `/phx:work` — 直接应用最高优先级修复
- `/phx:investigate` — 深入调查特定发现
Tidewave集成
如果Tidewave MCP可用:
- 使用
mcp__tidewave__project_eval在可疑查询上运行Repo.query!("EXPLAIN ANALYZE ...") - 使用
mcp__tidewave__project_eval检查Process.info(pid, :message_queue_len)以查找GenServer瓶颈 - 使用
mcp__tidewave__execute_sql_query检查缺失索引
参考资料
references/benchmarking.md— Benchee模式、性能分析、火焰图