Performance Optimizing
Optimization Workflow
- •Measure first - Don't optimize without data
- •Find bottlenecks - Profile to identify hot paths
- •Fix the biggest issue - Pareto principle (80/20)
- •Measure again - Verify improvement
- •Document - Record what changed and why
Common Bottlenecks
Database
| Problem | Solution |
|---|---|
| N+1 queries | Eager loading, batching |
| Missing indexes | Add indexes on WHERE/JOIN columns |
| Full table scans | Optimize queries, add indexes |
| Over-fetching | Select only needed columns |
typescript
// Bad - N+1 queries
for (const user of users) {
const posts = await db.posts.findByUserId(user.id);
}
// Good - single query with join
const usersWithPosts = await db.users.findAll({
include: ['posts'],
});
Memory
| Problem | Solution |
|---|---|
| Memory leaks | Clear references, use WeakMap |
| Large objects | Stream processing, pagination |
| Duplicated data | Normalize, use references |
CPU
| Problem | Solution |
|---|---|
| Blocking operations | Use async/workers |
| Redundant computation | Memoization, caching |
| Inefficient algorithms | Better data structures |
typescript
// Bad - O(n) lookup on every iteration
for (const item of items) {
if (list.includes(item.id)) { ... }
}
// Good - O(1) lookup with Set
const idSet = new Set(list);
for (const item of items) {
if (idSet.has(item.id)) { ... }
}
Network
| Problem | Solution |
|---|---|
| Too many requests | Batching, HTTP/2 |
| Large payloads | Compression, pagination |
| No caching | HTTP caching, CDN |
Quick Wins
- •Add indexes on frequently queried columns
- •Enable compression (gzip/brotli)
- •Implement caching at appropriate layers
- •Use pagination for large datasets
- •Lazy load non-critical resources
Anti-Patterns
- •Premature optimization without measurement
- •Micro-optimizations that hurt readability
- •Caching everything (cache invalidation is hard)
- •Optimizing cold paths