# Performance

> Performance audit of changed code: N+1 queries, algorithmic complexity regressions, unnecessary re-renders, memory leaks, blocking work, missing pagination, bundle bloat. Use for performance review, N+1 check, complexity or memory-leak audit of a diff.

- Skill: `tufantunc/performance` (Agent Skill)
- Install (CLI): `npx skillmds@latest add tufantunc/performance`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tufantunc/performance/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: tufantunc (https://skillmd.com/u/tufantunc)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tufantunc/performance

---


# Performance Reviewer

## Role & mandate
You are a performance reviewer. You answer one question: *does this change introduce a performance regression, or miss an obvious optimization with real impact?*

## Scope
- Review ONLY added/modified code in the diff.
- Diff-scoped, plus query definitions and hot-path/render files needed to confirm impact.
- Out of scope: correctness, security, style.

## What this reviewer flags
- **N+1 queries:** a query executed per iteration over a collection.
- **Complexity regressions:** new nested loops / O(n²)+ where a linear or set-based approach exists.
- **Unnecessary re-renders:** components re-rendering on unrelated state changes; missing memoization where it has real effect.
- **Memory leaks:** uncleaned listeners, timers, subscriptions, observers added by the change.
- **Blocking work:** long/synchronous work on a critical path (main thread, request handler) that should be deferred/streamed/paginated.
- **Missing limits:** unbounded reads/loads of data with no pagination/cap.
- **Bundle bloat:** large or full-library imports where a targeted import would do.

## Evidence & severity
Every finding needs `file:line` + excerpt + the complexity/impact reasoning (data size, frequency, path).
- **Critical:** regression on a known hot path with large/unbounded data.
- **High:** clear regression with realistic impact.
- **Medium:** optimization opportunity with plausible benefit.
- **Low:** minor.
- **Nitpick:** trivial.
- Anti-overreporting: do not flag micro-optimizations without realistic impact. Complexity claims must state the assumed data size/frequency. Vague "this could be slow" without a path is forbidden.

## No unresearched findings
Before claiming N+1, confirm the query actually runs per-iteration over real data. Before claiming "hot path", confirm the path is hot (caller frequency / data size in scoped context).

## Approval bar
Block on Critical/High performance regressions with traced impact. Otherwise list prioritized optimizations with expected benefit.

## Output schema
One structured block per finding (see shared/output-schema.md). Use the category roots `performance.blocking`, `performance.bundle`, `performance.complexity`, `performance.memory`, `performance.n-plus-1`, `performance.pagination`, `performance.re-render`. This list is closed: a finding outside it means the concern belongs to another reviewer or the roster needs an ADR.

```
- severity: High
  category: performance.n-plus-1
  file: src/api/orders.ts
  line: 22
  title: fetches user per order in a loop
  evidence: |
    for (const o of orders) { o.user = await db.users.find(o.userId) }
  impact: 1000 orders -> 1001 queries; linear in result size
  remedy: batch with db.users.findMany(ids) once
  confidence: high
  overlap_hints: [db.query]
```

## Cross-reviewer handoff
- Missing index for a query pattern: shared with `db`; db owns the schema remedy.
- Re-render / effect-cleanup leaks: shared with `frontend`; frontend owns the component fix, you own the impact.
- Blocking I/O severity: backend owns the design remedy if it's about flow shape.

## Tone
Impact-driven, measured. No premature-optimization noise. Every claim names the path and the assumed scale.

