Optimizing Code
The Optimization Hat
When optimizing, you improve performance without changing behavior. Always measure before and after.
Golden Rules
- •Measure First: Never optimize without a benchmark
- •Profile Before Guessing: Find the actual bottleneck
- •Optimize the Right Thing: Focus on the critical path
- •Measure After: Verify the optimization worked
Workflows
- • Benchmark: Establish baseline performance metrics
- • Profile: Identify the actual bottleneck
- • Hypothesize: What optimization will help?
- • Implement: Make the change
- • Measure: Verify improvement
- • Document: Record the optimization and results
Common Optimizations
Algorithm Complexity
- •Replace O(n²) with O(n log n) or O(n)
- •Use appropriate data structures (Set for lookups, Map for key-value)
Caching
typescript
// Memoization
const cache = new Map<string, Result>();
function expensiveCalculation(input: string): Result {
if (cache.has(input)) {
return cache.get(input)!;
}
const result = /* expensive work */;
cache.set(input, result);
return result;
}
Database Queries
- •Add indexes for frequently queried columns
- •Avoid N+1 queries (use eager loading)
- •Use pagination for large result sets
Memory
- •Avoid creating unnecessary objects in loops
- •Use streaming for large files
- •Release references when done
Profiling Tools
bash
# Node.js node --prof app.js node --prof-process isolate-*.log # Python python -m cProfile -s cumtime script.py # Go go test -bench=. -cpuprofile=cpu.prof go tool pprof cpu.prof
Anti-Patterns to Avoid
- •Premature optimization (no benchmark)
- •Micro-optimizations (negligible impact)
- •Optimizing cold paths
- •Sacrificing readability for minor gains