Skill

optimizing-performance

Install
1
Install the plugin
$
npx claudepluginhub drewdresser/ai-dev-settings --plugin ai-dev

Want just this skill?

Add to a custom plugin, then install with one command.

Description

Knowledge and patterns for identifying and resolving performance issues.

Tool Access

This skill uses the workspace's default tool permissions.

Skill Content

Optimizing Performance Skill

This skill provides patterns and techniques for performance optimization.

Performance Analysis Process

1. Measure First

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

# Memory profiling
python -m memory_profiler script.py

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

2. Identify Bottlenecks

  • CPU-bound: Computation heavy
  • I/O-bound: Waiting for disk/network
  • Memory-bound: High memory usage
  • Concurrency: Lock contention

3. Optimize Systematically

  • Focus on hotspots (80/20 rule)
  • One change at a time
  • Measure after each change
  • Document trade-offs

Common Optimizations

Database

N+1 Query Problem

# Bad: N+1 queries
users = User.query.all()
for user in users:
    print(user.orders)  # Query per user!

# Good: Eager loading
users = User.query.options(joinedload(User.orders)).all()
for user in users:
    print(user.orders)  # Already loaded

Indexing

-- Identify slow queries
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

-- Add index
CREATE INDEX idx_users_email ON users(email);

-- Composite index for common queries
CREATE INDEX idx_orders_user_status ON orders(user_id, status);

Query Optimization

-- Bad: SELECT *
SELECT * FROM users WHERE status = 'active';

-- Good: Select needed columns
SELECT id, name, email FROM users WHERE status = 'active';

-- Bad: LIKE with leading wildcard
SELECT * FROM users WHERE name LIKE '%john%';

-- Better: Full-text search or specific patterns
SELECT * FROM users WHERE name LIKE 'john%';

Caching

Application-Level Cache

from functools import lru_cache

@lru_cache(maxsize=128)
def expensive_computation(x, y):
    return complex_calculation(x, y)

Distributed Cache (Redis)

import redis

cache = redis.Redis()

def get_user(user_id):
    # Try cache first
    cached = cache.get(f"user:{user_id}")
    if cached:
        return json.loads(cached)

    # Fetch from DB
    user = db.query(User).get(user_id)

    # Store in cache
    cache.setex(f"user:{user_id}", 3600, json.dumps(user.to_dict()))
    return user.to_dict()

HTTP Caching

from flask import make_response

@app.route('/static-data')
def static_data():
    response = make_response(get_static_data())
    response.headers['Cache-Control'] = 'public, max-age=3600'
    response.headers['ETag'] = compute_etag(data)
    return response

Async Processing

Background Jobs

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379')

@app.task
def send_email(to, subject, body):
    # Heavy operation in background
    email_service.send(to, subject, body)

# Usage
send_email.delay("user@example.com", "Welcome", "...")

Async I/O

import asyncio
import aiohttp

async def fetch_all(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        return await asyncio.gather(*tasks)

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

Memory Optimization

Generators Instead of Lists

# Bad: Loads all into memory
def get_all_users():
    return [User.from_row(row) for row in db.fetchall()]

# Good: Process one at a time
def get_all_users():
    for row in db.fetchall():
        yield User.from_row(row)

Slots for Classes

class Point:
    __slots__ = ['x', 'y']  # 40% less memory than dict

    def __init__(self, x, y):
        self.x = x
        self.y = y

Weak References

import weakref

class Cache:
    def __init__(self):
        self._cache = weakref.WeakValueDictionary()

Algorithm Optimization

Time Complexity

OperationListDict/Set
LookupO(n)O(1)
InsertO(n)O(1)
DeleteO(n)O(1)
# Bad: O(n) lookup
if item in my_list:  # Scans entire list
    ...

# Good: O(1) lookup
if item in my_set:  # Hash lookup
    ...

Space-Time Trade-offs

# Compute once, store result (memoization)
@lru_cache(maxsize=1000)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

Performance Checklist

Database

  • Queries are using indexes
  • No N+1 query problems
  • Pagination for large result sets
  • Connection pooling enabled
  • Queries select only needed columns

Application

  • Expensive operations are cached
  • Heavy work is done asynchronously
  • Resources are properly cleaned up
  • Memory usage is bounded
  • No memory leaks

Network

  • API responses are compressed
  • Static assets are cached
  • Minimal round trips
  • Connection pooling/keep-alive

Frontend

  • Assets are minified
  • Images are optimized
  • Lazy loading for large lists
  • Bundle size is reasonable

Monitoring

Key Metrics

  • Response time (p50, p95, p99)
  • Throughput (requests/second)
  • Error rate
  • CPU/Memory usage
  • Database query time

Tools

  • APM: New Relic, Datadog, Sentry
  • Profiling: py-spy, cProfile, Chrome DevTools
  • Database: EXPLAIN, pg_stat_statements
  • Load testing: k6, locust, wrk
Stats
Stars0
Forks0
Last CommitJan 22, 2026
Actions

Similar Skills