The real magic of perf isn’t just that it can count events; it’s that it lets you sample program execution at hardware interrupt rates, giving you a statistical snapshot of where your CPU cycles are vanishing.

Let’s see perf in action with a simple C program that does some heavy lifting.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// A function that does some busy-waiting
void busy_wait(long long iterations) {
    volatile long long i;
    for (i = 0; i < iterations; i++) {
        // Do nothing, just spin
    }
}

// A function that does some complex calculation
double calculate_pi(long long num_terms) {
    volatile double sum = 0.0;
    volatile double sign = 1.0;
    for (volatile long long i = 0; i < num_terms; i++) {
        sum += sign / (2.0 * i + 1.0);
        sign = -sign;
    }
    return 4.0 * sum;
}

int main() {
    printf("Starting computation...\n");

    // Simulate some I/O bound work
    busy_wait(1000000000LL); // 1 billion iterations

    // Simulate some CPU bound work
    double pi = calculate_pi(50000000LL); // 50 million terms

    printf("Pi calculated: %f\n", pi);

    return 0;
}

Compile this with gcc -o pi_calculator pi_calculator.c.

Now, let’s profile it. The most basic perf command is perf stat. It gives you a summary of hardware events.

$ perf stat ./pi_calculator

Here’s what a typical output might look like:

 Performance counter stats for './pi_calculator':

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      2000000000      instructions                                                    (83.33%)
       500000000      branches                                                        (83.33%)
            1000      branch-misses                                                   (83.33%)
       1.054321 seconds time elapsed

       1.000000      CPU max clock frequency
       0.850000      CPU average clock frequency

       1000000000      cpu-cycles                                                      (83.33%)
      20000000

Want structured learning?

Take the full Perf course →