SkillProgramaçãoRevisão

Revisão de Performance

Identifica regressões de performance introduzidas por um PR: complexidade algorítmica, queries ineficientes e gargalos em hot paths. Use em PRs que tocam processamento de dados, acesso a banco, chamadas de rede ou caminhos críticos.

Ações
PerfilDev
ProfundidadeAlta
IdiomaInglês (skill original)
Objetivo

Em uma frase.

Identificar regressões de performance introduzidas pelo PR — cobrindo complexidade algorítmica, queries ineficientes, alocações desnecessárias de memória, operações bloqueantes em contextos assíncronos e gargalos em caminhos críticos de execução.

Aplicação

Quando
faz sentido.

Usar
  • Em PRs que tocam lógica de processamento de dados, acesso a banco, chamadas de rede, loops sobre coleções ou caminhos críticos.
  • Quando o código roda em contexto de alta carga ou frequência (endpoint muito usado, worker, job batch).
  • Quando o PR altera código que já apresentou problemas de performance antes.
Não usar
  • Para micro-otimizações sem impacto mensurável — o foco é em regressões reais.
  • Para revisão de lógica ou segurança — use as skills correspondentes.
  • Antes de mapear o escopo do PR com understanding-pr-scope — é preciso identificar hot paths primeiro.
Prompt

Instruções
para a IA.

### Passo 1 — Identifique os hot paths

Classifique cada mudança por relevância de performance. Hot paths (alta prioridade): código em cada request, loops sobre coleções que crescem com dados, jobs batch, serialização de alta frequência. Cold paths (baixa prioridade): inicialização única, handlers de erro raros, código administrativo. Concentre a análise nos hot paths.

### Passo 2 — Verifique complexidade algorítmica

Para cada loop em hot path, avalie a complexidade de tempo, se n pode crescer indefinidamente, se há loops aninhados explosivos e se buscas usam Set/Map (O(1)) em vez de Array (O(n)).

### Passo 3 — Verifique acesso ao banco

Procure queries N+1 (query dentro de loop, lazy loading onde caberia eager), queries sem índice (LIKE '%termo%', full table scan) e problemas de volume (SELECT *, ausência de LIMIT).

### Passos 4 a 6 — Memória, assincronismo e cache

Verifique alocações desnecessárias em hot paths, operações bloqueantes em contexto assíncrono (I/O síncrono no event loop, await sequencial onde Promise.all paralelizaria) e ausência de cache em operações caras e repetíveis. Sempre estime o impacto sob carga real (ex.: "com 10k usuários simultâneos, este N+1 gera 10k queries por request"). Marque problemas de cold path como baixa severidade e declare "No performance issues found" quando não houver nenhum.
Casos

Exemplos
de uso.

**Contexto:** um endpoint retorna pedidos recentes com o nome do cliente de cada um.

```typescript
// src/controllers/OrderController.ts
const orders = await this.orderRepository.findRecent(50);
const result = await Promise.all(
  orders.map(async (order) => {
    const customer = await this.customerRepository.findById(order.customerId);
    return { id: order.id, total: order.total, customerName: customer.name };
  })
);
```

**Saída esperada do agente**

**Tipo:** N+1 Query
**Descrição:** 1 query para 50 pedidos + 50 queries para buscar o cliente de cada um = 51 queries por request. Mesmo com `Promise.all`, o volume no banco é N+1.
**Impacto estimado:** a 100 req/s, ~5.100 queries/s só neste endpoint; o connection pool satura primeiro em pico.
**Severidade:** alta
**Sugestão:** usar JOIN ou eager loading para buscar pedidos e clientes em uma única query.
Execução

Como usar
com IA.

  1. 01Copie a skill (botão "Copiar skill para IA", no topo): o texto copiado já é a skill completa, não um resumo.
  2. 02Abra o Claude ou Claude Code e cole — a IA recebe todas as instruções e fica pronta para a tarefa.
  3. 03Prefere usar como arquivo reutilizável? Baixe o .zip e coloque o SKILL.md em .claude/skills/ (Claude Code) ou anexe o arquivo no Claude (claude.ai).