跳到正文
cccskills
免费在 GitHub 公开

phx-perf

Use when anything in a Phoenix app is slow, times out, or uses too much memory, even if the cause looks obvious. Load it before analyzing or fixing: it runs measured Ecto, LiveView and OTP checks and ranks fixes.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(2)

  • SKILL.md3.8 KB
  • references/benchmarking.md5.2 KB

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Performance Analysis

Analyze code for performance issues across Ecto, LiveView, and OTP layers. Prioritize findings by impact and effort.

Usage

phx-perf                           # Analyze full project
phx-perf lib/my_app/accounts.ex    # Analyze specific module
phx-perf --focus ecto              # Ecto queries only
phx-perf --focus liveview          # LiveView memory only
phx-perf --focus otp               # OTP bottlenecks only

Arguments

$ARGUMENTS = Optional module/context path and --focus flag.

Iron Laws

  1. MEASURE BEFORE OPTIMIZING — Never optimize without evidence of a problem
  2. DATABASE FIRST — 90% of Elixir performance issues are query-related
  3. ONE CHANGE AT A TIME — Isolate optimizations to measure impact
  4. NEVER benchmark in dev mode — Always use MIX_ENV=prod for performance measurements; dev mode includes code reloading, debug logging, and unoptimized compilation that invalidate results

Workflow

Step 1: Identify Scope

Check specific file if provided. Otherwise scan full project:

# Find hot paths: contexts, LiveViews, workers
find lib/ -name "*.ex" | head -50

Step 2: Run Analysis Tracks

Spawn analysis agents in parallel based on focus:

Ecto Track (default or --focus ecto):

Spawn phx:elixir-reviewer with prompt: "Analyze for N+1 queries, missing preloads, unindexed queries, and inefficient patterns. Check: Repo.all in loops, Enum.map with Repo calls, missing preload, queries without indexes on WHERE/JOIN columns."

LiveView Track (default or --focus liveview):

Spawn phx:elixir-reviewer with prompt: "Analyze LiveViews for memory issues: large assigns, missing streams for lists, assigns that grow unbounded, heavy handle_info processing, missing assign_async for slow ops."

OTP Track (only with --focus otp):

Spawn phx:otp-advisor with prompt: "Analyze for OTP bottlenecks: GenServer mailbox growth, synchronous calls in hot paths, missing Task.async for parallel work, ETS opportunities for read-heavy state."

Step 3: Prioritize Findings

Score each finding on a 2x2 matrix:

Low EffortHigh Effort
High ImpactDO FIRSTPLAN
Low ImpactQUICK WINSKIP

High impact = affects response time, memory per user, or query count. Low effort = single file change, no migration needed.

Step 4: Present Top 5

Present findings sorted by priority:

## Performance Analysis: {scope}

### 1. {Finding} — DO FIRST
**Impact**: {what improves}
**Location**: {file}:{line}
**Current**: {problematic pattern}
**Fix**: {optimized pattern}
**Estimated gain**: {e.g., "eliminates N+1, reduces queries from O(n) to O(1)"}

### 2. {Finding} — PLAN
...

Step 5: Offer Next Steps

Always end with actionable next steps — findings without follow-up get lost. Present options based on severity:

How would you like to proceed?

- `phx-plan` — Create a plan from these findings (recommended for 3+ fixes)
- `phx-quick` — Apply top priority fix directly (1-2 simple fixes)
- `phx-investigate` — Deep-dive into a specific finding

Tidewave Integration

If Tidewave MCP is available:

  • Use mcp__tidewave__project_eval to run Repo.query!("EXPLAIN ANALYZE ...") on suspicious queries
  • Use mcp__tidewave__project_eval to check Process.info(pid, :message_queue_len) for GenServer bottlenecks
  • Use mcp__tidewave__execute_sql_query to check missing indexes

References

  • references/benchmarking.md — Benchee patterns, profiling, flame graphs

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

analyze

免费

Analyze a legacy app in any language before rewriting it in Elixir: inventory, features as goals, why each mechanism exists, runtime topology, external contracts. Use to start or refresh a rewrite.

中文简介正在准备中。当前显示原文说明。

oliver-kriska/claude-elixir-phoenix5692026年10月20日 更新

architect

免费

Design the idiomatic Elixir architecture for a rewrite: set the compatibility bar (ADR-000), consult phx specialists on open questions, then build contexts, ledger and ADRs. Use after /rewrite:analyze.

中文简介正在准备中。当前显示原文说明。

oliver-kriska/claude-elixir-phoenix5692026年10月20日 更新

Ash Framework — resources, actions, policies, aggregates; Use when generating resources via mix ash.codegen, editing…

中文简介正在准备中。当前显示原文说明。

oliver-kriska/claude-elixir-phoenix5692026年10月20日 更新

Ash Framework — resources, actions, policies, aggregates, calculations, AshPhoenix.Form, LiveView, migrations. Use when generating resources via mix ash.codegen, editing changes, checks, types, validations, or domain code interfaces.

中文简介正在准备中。当前显示原文说明。

oliver-kriska/claude-elixir-phoenix5692026年10月20日 更新

assigns

免费

Compatibility alias for the Elixir/Phoenix plugin's LiveView assigns audit. Invoke explicitly with /lv:assigns.

中文简介正在准备中。当前显示原文说明。

oliver-kriska/claude-elixir-phoenix5692026年10月20日 更新

Inspect LiveView socket assigns for memory bloat — missing temporary_assigns, unused assigns, unbounded lists needing streams, memory estimates. Use when LiveView memory grows or you need to add temporary_assigns.

中文简介正在准备中。当前显示原文说明。

oliver-kriska/claude-elixir-phoenix5692026年10月20日 更新

查看 oliver-kriska 的全部技能

报告此技能的问题