Claude Code Plugins

Community-maintained marketplace

Feedback

performance-profiler

@korallis/Droidz
8
0

Auto-activates when user mentions performance, profiling, optimization, slow code, or bottlenecks. Profiles and optimizes code performance.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name performance-profiler
description Use when user mentions performance, profiling, optimization, slow code, or bottlenecks. Profiles and optimizes code performance.
category performance

Performance Profiler

Analyzes and optimizes code performance with actionable recommendations.

When This Activates

  • User says: "profile this", "performance", "optimize", "why is this slow?"
  • Code is running slowly
  • Before production deployment (performance audit)

Performance Analysis Checklist

1. Time Complexity Analysis

  • Identify algorithm complexity (Big O notation)
  • Find nested loops (O(n²) or worse)
  • Check recursion depth
  • Analyze sort/search operations

2. Database Performance

  • Check for N+1 query problems
  • Verify indexes exist on queried columns
  • Analyze query execution plans
  • Check for missing pagination

3. Memory Usage

  • Check for memory leaks
  • Analyze object retention
  • Verify proper cleanup (event listeners, timers)
  • Check for large data structures

4. Network Performance

  • Check API request count
  • Verify response caching
  • Check for sequential requests (should be parallel)
  • Analyze payload sizes

5. Frontend Performance

  • Check bundle size
  • Analyze render performance
  • Verify lazy loading
  • Check for unnecessary re-renders

Profiling Tools

JavaScript/TypeScript

# Node.js profiling
node --prof app.js
node --prof-process isolate-*-v8.log > processed.txt

# Chrome DevTools
# Open DevTools → Performance → Record

# Lighthouse
npx lighthouse https://yoursite.com --view

# Bundle analysis
npx webpack-bundle-analyzer stats.json

Python

# cProfile
python -m cProfile -s cumtime script.py

# line_profiler
@profile
def slow_function():
    # Code to profile
    pass

Common Performance Issues

Issue 1: N+1 Query Problem

Bad:

// 1 query to get users + N queries to get posts
const users = await db.query('SELECT * FROM users');
for (const user of users) {
  user.posts = await db.query('SELECT * FROM posts WHERE user_id = $1', [user.id]);
}

Good:

// 1 query with JOIN
const users = await db.query(`
  SELECT u.*, json_agg(p.*) as posts
  FROM users u
  LEFT JOIN posts p ON p.user_id = u.id
  GROUP BY u.id
`);

Issue 2: Missing Indexes

Diagnosis:

-- Check query performance
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'user@example.com';
-- If "Seq Scan", missing index!

Fix:

CREATE INDEX idx_users_email ON users(email);

Issue 3: Memory Leak

Bad:

// Event listener never removed
element.addEventListener('click', handler);
// Memory leak if element is removed from DOM

Good:

const controller = new AbortController();
element.addEventListener('click', handler, {
  signal: controller.signal
});
// Cleanup
controller.abort();

Issue 4: Unnecessary Re-renders (React)

Bad:

function Component() {
  // Creates new array on every render
  const items = users.map(u => transform(u));
  return <List items={items} />;
}

Good:

function Component() {
  // Memoize expensive computation
  const items = useMemo(
    () => users.map(u => transform(u)),
    [users]
  );
  return <List items={items} />;
}

Issue 5: Large Bundle Size

Diagnosis:

npx webpack-bundle-analyzer dist/stats.json

Fixes:

// Lazy load routes
const Dashboard = lazy(() => import('./Dashboard'));

// Tree-shake unused code
import { specific } from 'library';  // not: import * as lib

// Use lighter alternatives
// lodash (full): 71KB → lodash-es (single function): 1KB
import debounce from 'lodash-es/debounce';

Performance Report

## ⚡ Performance Analysis Report

### 📊 Metrics

**Before:**
- Page load: 4.2s
- Time to Interactive (TTI): 5.8s
- First Contentful Paint: 2.1s
- Bundle size: 850KB
- API calls: 15 requests

**After:**
- Page load: 1.8s ✅ (57% faster)
- TTI: 2.3s ✅ (60% faster)
- FCP: 0.9s ✅ (57% faster)
- Bundle size: 320KB ✅ (62% reduction)
- API calls: 3 requests ✅ (80% reduction)

### 🐌 Bottlenecks Found

1. **N+1 Query Problem** (src/api/users.ts:45)
   - Impact: 2.5s added to response time
   - Fix: Use JOIN query instead of loop
   - Priority: HIGH

2. **Missing Index** (users.email)
   - Impact: 800ms per query
   - Fix: `CREATE INDEX idx_users_email ON users(email)`
   - Priority: HIGH

3. **Large Bundle** (moment.js: 280KB)
   - Impact: 1.2s additional load time
   - Fix: Replace with date-fns (11KB)
   - Priority: MEDIUM

4. **Unnecessary Re-renders** (Dashboard component)
   - Impact: Laggy UI, CPU usage
   - Fix: Add React.memo() and useMemo()
   - Priority: MEDIUM

### ✅ Optimizations Applied

1. Implemented query batching → **2.5s saved**
2. Added database indexes → **800ms saved per query**
3. Replaced heavy libraries → **530KB bundle reduction**
4. Memoized React components → **60% fewer renders**
5. Enabled response caching → **70% fewer API calls**

### 📈 Performance Score

- **Before:** 45/100 (Poor)
- **After:** 92/100 (Excellent) ✅

### 💡 Next Steps

1. Implement lazy loading for dashboard routes
2. Add CDN for static assets
3. Enable HTTP/2 server push
4. Consider service worker for offline support

Benchmarking

// Measure execution time
console.time('operation');
expensiveOperation();
console.timeEnd('operation');

// More precise
const start = performance.now();
expensiveOperation();
const end = performance.now();
console.log(`Took ${end - start}ms`);

// Benchmark multiple runs
function benchmark(fn, runs = 100) {
  const times = [];
  for (let i = 0; i < runs; i++) {
    const start = performance.now();
    fn();
    times.push(performance.now() - start);
  }
  const avg = times.reduce((a, b) => a + b) / times.length;
  console.log(`Average: ${avg}ms`);
  console.log(`Min: ${Math.min(...times)}ms`);
  console.log(`Max: ${Math.max(...times)}ms`);
}

Performance Budget

Set performance budgets:

{
  "budgets": [
    {
      "resourceSizes": [
        { "resourceType": "script", "budget": 300 },
        { "resourceType": "total", "budget": 500 }
      ]
    },
    {
      "timings": [
        { "metric": "interactive", "budget": 3000 },
        { "metric": "first-contentful-paint", "budget": 1000 }
      ]
    }
  ]
}

Best Practices

DO:

  • Profile before optimizing (measure first!)
  • Focus on bottlenecks (80/20 rule)
  • Use production mode for realistic metrics
  • Test with realistic data sizes
  • Measure impact of optimizations

DON'T:

  • Premature optimization
  • Optimize without profiling
  • Sacrifice readability for micro-optimizations
  • Forget to test after optimizations
  • Optimize everything at once

Profile code, identify bottlenecks, suggest optimizations, measure improvements.