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
// 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
# 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
Scan to join WeChat group