# perf **perf** is a Linux profiling tool that reads hardware performance counters from the CPU. Measure cycles, instructions, cache misses, branches—everything the CPU tracks natively. Answer the fundamental question: where is the program spending time, and why is it slow? Unlike guessing, perf gives ground truth from the hardware. Low overhead (1-5%), no recompilation needed, and the data is reliable. In HPC work, perf is the first tool to reach for when something is slower than expected. ```bash $ perf stat ./program Performance counter stats for './program': 4,102.38 msec task-clock # 3.98 CPUs utilized 16,847,203,412 cycles # 4.107 GHz 12,334,901,088 instructions # 0.73 insn per cycle 401,292,771 cache-misses # 33.33% of cache refs ``` IPC (instructions per cycle) of 0.73 on a modern superscalar CPU means the pipeline is stalled. A 33% cache miss rate means it's waiting for memory. Two numbers tell you everything you need to know to start optimizing. ## Concepts 1. [[perf-basics|Basics]] 2. [[perf-stat|perf stat]] 3. [[perf-record|perf record]] 4. [[perf-report|perf report]] 5. [[perf-annotate|perf annotate]] 6. [[perf-events|Events]] 7. [[perf-metrics|Metrics]] 8. [[perf-flame-graphs|Flame graphs]] 9. [[perf-sampling|Sampling]] 10. [[perf-scripting|Scripting]]