Measure first, then isolate the hot path: I/O, allocation, contention, or algorithmic cost.
Most performance problems you see in Clojure have the same root causes you already know from Java: too much work, too much allocation, too much waiting on I/O, or too much contention.
This section helps you avoid “cargo-cult optimization.” Instead of guessing, you’ll set a goal, reproduce the workload, and narrow the bottleneck to something you can actually change.
Along the way, you’ll learn a few Clojure-specific places where performance can surprise Java engineers (reflection, boxing, lazy sequence retention) and how to spot those issues early.