Use when optimizing code for performance, reducing bundle size, improving load times, or fixing performance bottlenecks. Emphasizes measurement-driven optimization.
View on GitHubSelect agents to install to:
npx add-skill https://github.com/TheBushidoCollective/han/blob/main/core/skills/performance-optimization/SKILL.md -a claude-code --skill performance-optimizationInstallation paths:
.claude/skills/performance-optimization/# Performance Optimization Skill
Systematic approach to identifying and fixing performance issues.
## Core Principle
**Measure, don't guess.** Optimization without data is guesswork.
## The Cardinal Rule
❌ **NEVER optimize without measuring first**
**Why:** Premature optimization wastes time on non-issues while missing real problems.
**Exception:** Obvious O(n²) algorithms when O(n) alternatives exist.
## Optimization Process
### 1. Measure Current State (Baseline)
**Before touching any code, establish metrics:**
**Frontend Performance:**
```bash
# Chrome DevTools Performance tab
# Lighthouse audit
npm run build && du -sh dist/ # Bundle size
```
**Backend Performance:**
```bash
# Add timing logs
start = Time.now
result = expensive_operation()
elapsed = Time.now - start
Logger.info("Operation took #{elapsed}ms")
```
**Database:**
```bash
# PostgreSQL
EXPLAIN ANALYZE SELECT ...;
# Check query time in logs
grep "SELECT" logs/production.log | grep "Duration:"
```
**Metrics to capture:**
- Load time / response time
- Time to interactive
- Bundle size
- Memory usage
- Query duration
- Render time
### 2. Profile to Find Bottlenecks
**Don't guess where the problem is - profile:**
**Browser Profiling:**
- Chrome DevTools > Performance tab
- Record interaction
- Look for long tasks (> 50ms)
- Check for layout thrashing
**Server Profiling:**
```bash
# Add detailed timing
defmodule Profiler do
def measure(label, func) do
start = System.monotonic_time(:millisecond)
result = func.()
elapsed = System.monotonic_time(:millisecond) - start
Logger.info("#{label}: #{elapsed}ms")
result
end
end
# Use it
Profiler.measure("Database query", fn ->
Repo.all(User)
end)
```
**React Profiling:**
```bash
# React DevTools Profiler
# Look for:
# - Unnecessary re-renders
# - Slow components (> 16ms for 60fps)
# - Large component trees
```
### 3. Identify Root Cause
**Common performance issues:**
**Frontend:**
- Large bundle size (lazy load,