perf-diff - Man Page

Read perf​.data files and display the differential profile

Synopsis

perf diff [baseline file] [data file1] [[data file2] ​... ]

Description

This command displays the performance difference amongst two or more perf​.data files captured via perf record​.

If no parameters are passed it will assume perf​.data​.old and perf​.data​.

The differential profile is displayed only for events matching both specified perf​.data files​.

If no parameters are passed the samples will be sorted by dso and symbol​. As the perf​.data files could come from different binaries, the symbols addresses could vary​. So perf diff is based on the comparison of the files and symbols name​.

Options

-D,  --dump-raw-trace

Dump raw trace in ASCII​.

--kallsyms=<file>

kallsyms pathname

-m,  --modules

Load module symbols​. WARNING: use only with -k and LIVE kernel

-d,  --dsos=

Only consider symbols in these dsos​. CSV that understands file://filename entries​. This option will affect the percentage of the Baseline/Delta column​. See --percentage for more info​.

-C,  --comms=

Only consider symbols in these comms​. CSV that understands file://filename entries​. This option will affect the percentage of the Baseline/Delta column​. See --percentage for more info​.

-S,  --symbols=

Only consider these symbols​. CSV that understands file://filename entries​. This option will affect the percentage of the Baseline/Delta column​. See --percentage for more info​.

-s,  --sort=

Sort by key(s): pid, comm, dso, symbol, cpu, parent, srcline​. Please see description of --sort in the perf-report man page​.

-t,  --field-separator=

Use a special separator character and don’t pad with spaces, replacing all occurrences of this separator in symbol names (and other output) with a ​. character, that thus it’s the only non valid separator​.

-v,  --verbose

Be verbose, for instance, show the raw counts in addition to the diff​.

-q,  --quiet

Do not show any warnings or messages​. (Suppress -v)

-f,  --force

Don’t do ownership validation​.

--symfs=<directory[,layout]>

Look for files with symbols relative to this directory​. The optional layout can be hierarchy (default, matches full path) or flat (only matches base name)​. This is useful when debug files are stored in a flat directory structure​.

-b,  --baseline-only

Show only items with match in baseline​.

-c,  --compute

Differential computation selection - delta, ratio, wdiff, cycles, delta-abs (default is delta-abs)​. Default can be changed using diff​.compute config option​. See Comparison Methods section for more info​.

--cycles-hist

Report a histogram and the standard deviation for cycles data​. It can help us to judge if the reported cycles data is noisy or not​. This option should be used with -c cycles​.

-p,  --period

Show period values for both compared hist entries​.

-F,  --formula

Show formula for given computation​.

-o,  --order

Specify compute sorting column number​. 0 means sorting by baseline overhead and 1 (default) means sorting by computed value of column 1 (data from the first file other base baseline)​. Values more than 1 can be used only if enough data files are provided​. The default value can be set using the diff​.order config option​.

--percentage

Determine how to display the overhead percentage of filtered entries​. Filters can be applied by --comms, --dsos and/or --symbols options​.

"relative" means it's relative to filtered entries only so that the
sum of shown entries will be always 100%​.  "absolute" means it retains
the original value before and after the filter is applied​.
--time

Analyze samples within given time window​. It supports time percent with multiple time ranges​. Time string is a%/n,b%/m,​... or a%-b%,c%-%d,​...​.

For example:
Select the second 10% time slice to diff:
perf diff --time 10%/2
Select from 0% to 10% time slice to diff:
perf diff --time 0%-10%
Select the first and the second 10% time slices to diff:
perf diff --time 10%/1,10%/2
Select from 0% to 10% and 30% to 40% slices to diff:
perf diff --time 0%-10%,30%-40%
It also supports analyzing samples within a given time window
<start>,<stop>​. Times have the format seconds​.nanoseconds​. If 'start'
is not given (i​.e​. time string is ',x​.y') then analysis starts at
the beginning of the file​. If stop time is not given (i​.e​. time
string is 'x​.y,') then analysis goes to the end of the file​.
Multiple ranges can be separated by spaces, which requires the argument
to be quoted e​.g​. --time "1234​.567,1234​.789 1235,"
Time string is'a1​.b1,c1​.d1:a2​.b2,c2​.d2'​. Use ':' to separate timestamps
for different perf​.data files​.
For example, we get the timestamp information from 'perf script'​.
perf script -i perf​.data​.old
  mgen 13940 [000]  3946​.361400: ​.​.​.
perf script -i perf​.data
  mgen 13940 [000]  3971​.150589 ​.​.​.
perf diff --time 3946​.361400,:3971​.150589,
It analyzes the perf​.data​.old from the timestamp 3946​.361400 to
the end of perf​.data​.old and analyzes the perf​.data from the
timestamp 3971​.150589 to the end of perf​.data​.
--cpu

Only diff samples for the list of CPUs provided​. Multiple CPUs can be provided as a comma-separated list with no space: 0,1​. Ranges of CPUs are specified with -: 0-2​. Default is to report samples on all CPUs​.

--pid=

Only diff samples for given process ID (comma separated list)​.

--tid=

Only diff samples for given thread ID (comma separated list)​.

--stream

Enable hot streams comparison​. Stream can be a callchain which is aggregated by the branch records from samples​.

Comparison

The comparison is governed by the baseline file​. The baseline perf​.data file is iterated for samples​. All other perf​.data files specified on the command line are searched for the baseline sample pair​. If the pair is found, specified computation is made and result is displayed​.

All samples from non-baseline perf​.data files, that do not match any baseline entry, are displayed with empty space within baseline column and possible computation results (delta) in their related column​.

Example files samples: - file A with samples f1, f2, f3, f4, f6 - file B with samples f2, f4, f5 - file C with samples f1, f2, f5

Example output: x - computation takes place for pair b - baseline sample percentage

Comparison Methods

delta

If specified the Delta column is displayed with value d computed as:

d = A->period_percent - B->period_percent

with: - A/B being matching hist entry from data/baseline file specified (or perf​.data/perf​.data​.old) respectively​.

  • period_percent being the % of the hist entry period value within single data file
  • with filtering by -C, -d and/or -S, period_percent might be changed relative to how entries are filtered​. Use --percentage=absolute to prevent such fluctuation​.

delta-abs

Same as 'delta` method, but sort the result with the absolute values​.

ratio

If specified the Ratio column is displayed with value r computed as:

r = A->period / B->period

with: - A/B being matching hist entry from data/baseline file specified (or perf​.data/perf​.data​.old) respectively​.

  • period being the hist entry period value

wdiff:WEIGHT-B,WEIGHT-A

If specified the Weighted diff column is displayed with value d computed as:

d = B->period * WEIGHT-A - A->period * WEIGHT-B
  • A/B being matching hist entry from data/baseline file specified (or perf​.data/perf​.data​.old) respectively​.
  • period being the hist entry period value
  • WEIGHT-A/WEIGHT-B being user supplied weights in the -c option behind : separator like -c wdiff:1,2​.
  • WEIGHT-A being the weight of the data file
  • WEIGHT-B being the weight of the baseline data file

cycles

If specified the [Program Block Range] Cycles Diff column is displayed​. It displays the cycles difference of same program basic block amongst two perf​.data​. The program basic block is the code between two branches​.

[Program Block Range] indicates the range of a program basic block​. Source line is reported if it can be found otherwise uses symbol+offset instead​.

See Also

perf-record(1), perf-report(1)

Referenced By

perf(1), perf-kvm(1).

09/07/2026 perf Manual