Elixir Performance Review
Quick Reference
| Issue Type | Reference | |------------|-----------| | Mailbox overflow, blocking calls | references/genserver-bottlenecks.md | | When to use ETS, read/write concurrency | references/ets-patterns.md | | Binary handling, large messages | references/memory.md | | Task patterns, flow control | references/concurrency.md |
Review Checklist
GenServer
- [ ] Not a single-process bottleneck for all requests
- [ ] No blocking operations in handle_call/cast
- [ ] Proper timeout configuration
- [ ] Consider ETS for read-heavy state
Memory
- [ ] Large binaries not copied between processes
- [ ] Streams used for large data transformations
- [ ] No unbounded data accumulation
Concurrency
- [ ] Task.Supervisor for dynamic tasks (not raw Task.async)
- [ ] No unbounded process spawning
- [ ] Proper backpressure for message producers
Database
- [ ] Preloading to avoid N+1 queries
- [ ] Pagination for large result sets
- [ ] Indexes for frequent queries
Valid Patterns (Do NOT Flag)
- Single GenServer for low-throughput - Not all state needs horizontal scaling
- Synchronous calls for critical paths - Consistency may require it
- In-memory state without ETS - ETS has overhead for small state
- Enum over Stream for small collections - Stream overhead not worth it
Context-Sensitive Rules
| Issue | Flag ONLY IF | |-------|--------------| | GenServer bottleneck | Handles > 1000 req/sec OR blocking I/O in callbacks | | Use streams | Processing > 10k items OR reading large files | | Use ETS | Read:write ratio > 10:1 AND concurrent access |
Before Submitting Findings
Load and follow review-verification-protocol before reporting any issue.