Commit a1668c25 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf diff: Add 'delta-abs' compute method

The 'delta-abs' compute method is same as 'delta' but shows entries with
bigger absolute delta first instead of sorting numerically.  This is
only useful together with -o option.

Below is default output (-c delta):

  $ perf diff -o 1 -c delta | grep -v ^# | head
    42.22%   +4.97%  [kernel.kallsyms]  [k] cfb_imageblit
     0.62%   +1.23%  [kernel.kallsyms]  [k] mutex_lock
             +1.15%  [kernel.kallsyms]  [k] copy_user_generic_string
     2.40%   +0.95%  [kernel.kallsyms]  [k] bit_putcs
     0.31%   +0.79%  [kernel.kallsyms]  [k] link_path_walk
             +0.64%  [kernel.kallsyms]  [k] kmem_cache_alloc
     0.00%   +0.57%  [kernel.kallsyms]  [k] __rcu_read_unlock
             +0.45%  [kernel.kallsyms]  [k] alloc_set_pte
     0.16%   +0.45%  [kernel.kallsyms]  [k] menu_select
             +0.41%  ld-2.24.so         [.] do_lookup_x

Now with 'delta-abs' it shows entries have bigger delta value either
positive or negative.

  $ perf diff -o 1 -c delta-abs | grep -v ^# | head
    42.22%   +4.97%  [kernel.kallsyms]  [k] cfb_imageblit
    12.72%   -3.01%  [kernel.kallsyms]  [k] intel_idle
     9.72%   -1.31%  [unknown]          [.] 0x0000000000411343
     0.62%   +1.23%  [kernel.kallsyms]  [k] mutex_lock
     2.40%   +0.95%  [kernel.kallsyms]  [k] bit_putcs
     0.31%   +0.79%  [kernel.kallsyms]  [k] link_path_walk
     1.35%   -0.71%  [kernel.kallsyms]  [k] smp_call_function_single
     0.00%   +0.57%  [kernel.kallsyms]  [k] __rcu_read_unlock
     0.16%   +0.45%  [kernel.kallsyms]  [k] menu_select
     0.72%   -0.44%  [kernel.kallsyms]  [k] lookup_fast
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20170210073614.24584-2-namhyung@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 19261401
...@@ -86,7 +86,7 @@ OPTIONS ...@@ -86,7 +86,7 @@ OPTIONS
-c:: -c::
--compute:: --compute::
Differential computation selection - delta,ratio,wdiff (default is delta). Differential computation selection - delta,ratio,wdiff,delta-abs (default is delta).
See COMPARISON METHODS section for more info. See COMPARISON METHODS section for more info.
-p:: -p::
...@@ -181,6 +181,10 @@ with: ...@@ -181,6 +181,10 @@ with:
relative to how entries are filtered. Use --percentage=absolute to relative to how entries are filtered. Use --percentage=absolute to
prevent such fluctuation. prevent such fluctuation.
delta-abs
~~~~~~~~~
Same as 'delta` method, but sort the result with the absolute values.
ratio ratio
~~~~~ ~~~~~
If specified the 'Ratio' column is displayed with value 'r' computed as: If specified the 'Ratio' column is displayed with value 'r' computed as:
......
...@@ -30,6 +30,7 @@ enum { ...@@ -30,6 +30,7 @@ enum {
PERF_HPP_DIFF__RATIO, PERF_HPP_DIFF__RATIO,
PERF_HPP_DIFF__WEIGHTED_DIFF, PERF_HPP_DIFF__WEIGHTED_DIFF,
PERF_HPP_DIFF__FORMULA, PERF_HPP_DIFF__FORMULA,
PERF_HPP_DIFF__DELTA_ABS,
PERF_HPP_DIFF__MAX_INDEX PERF_HPP_DIFF__MAX_INDEX
}; };
...@@ -73,11 +74,13 @@ enum { ...@@ -73,11 +74,13 @@ enum {
COMPUTE_DELTA, COMPUTE_DELTA,
COMPUTE_RATIO, COMPUTE_RATIO,
COMPUTE_WEIGHTED_DIFF, COMPUTE_WEIGHTED_DIFF,
COMPUTE_DELTA_ABS,
COMPUTE_MAX, COMPUTE_MAX,
}; };
const char *compute_names[COMPUTE_MAX] = { const char *compute_names[COMPUTE_MAX] = {
[COMPUTE_DELTA] = "delta", [COMPUTE_DELTA] = "delta",
[COMPUTE_DELTA_ABS] = "delta-abs",
[COMPUTE_RATIO] = "ratio", [COMPUTE_RATIO] = "ratio",
[COMPUTE_WEIGHTED_DIFF] = "wdiff", [COMPUTE_WEIGHTED_DIFF] = "wdiff",
}; };
...@@ -86,6 +89,7 @@ static int compute; ...@@ -86,6 +89,7 @@ static int compute;
static int compute_2_hpp[COMPUTE_MAX] = { static int compute_2_hpp[COMPUTE_MAX] = {
[COMPUTE_DELTA] = PERF_HPP_DIFF__DELTA, [COMPUTE_DELTA] = PERF_HPP_DIFF__DELTA,
[COMPUTE_DELTA_ABS] = PERF_HPP_DIFF__DELTA_ABS,
[COMPUTE_RATIO] = PERF_HPP_DIFF__RATIO, [COMPUTE_RATIO] = PERF_HPP_DIFF__RATIO,
[COMPUTE_WEIGHTED_DIFF] = PERF_HPP_DIFF__WEIGHTED_DIFF, [COMPUTE_WEIGHTED_DIFF] = PERF_HPP_DIFF__WEIGHTED_DIFF,
}; };
...@@ -111,6 +115,10 @@ static struct header_column { ...@@ -111,6 +115,10 @@ static struct header_column {
.name = "Delta", .name = "Delta",
.width = 7, .width = 7,
}, },
[PERF_HPP_DIFF__DELTA_ABS] = {
.name = "Delta Abs",
.width = 7,
},
[PERF_HPP_DIFF__RATIO] = { [PERF_HPP_DIFF__RATIO] = {
.name = "Ratio", .name = "Ratio",
.width = 14, .width = 14,
...@@ -298,6 +306,7 @@ static int formula_fprintf(struct hist_entry *he, struct hist_entry *pair, ...@@ -298,6 +306,7 @@ static int formula_fprintf(struct hist_entry *he, struct hist_entry *pair,
{ {
switch (compute) { switch (compute) {
case COMPUTE_DELTA: case COMPUTE_DELTA:
case COMPUTE_DELTA_ABS:
return formula_delta(he, pair, buf, size); return formula_delta(he, pair, buf, size);
case COMPUTE_RATIO: case COMPUTE_RATIO:
return formula_ratio(he, pair, buf, size); return formula_ratio(he, pair, buf, size);
...@@ -461,6 +470,7 @@ static void hists__precompute(struct hists *hists) ...@@ -461,6 +470,7 @@ static void hists__precompute(struct hists *hists)
switch (compute) { switch (compute) {
case COMPUTE_DELTA: case COMPUTE_DELTA:
case COMPUTE_DELTA_ABS:
compute_delta(he, pair); compute_delta(he, pair);
break; break;
case COMPUTE_RATIO: case COMPUTE_RATIO:
...@@ -498,6 +508,13 @@ __hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right, ...@@ -498,6 +508,13 @@ __hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right,
return cmp_doubles(l, r); return cmp_doubles(l, r);
} }
case COMPUTE_DELTA_ABS:
{
double l = fabs(left->diff.period_ratio_delta);
double r = fabs(right->diff.period_ratio_delta);
return cmp_doubles(l, r);
}
case COMPUTE_RATIO: case COMPUTE_RATIO:
{ {
double l = left->diff.period_ratio; double l = left->diff.period_ratio;
...@@ -564,7 +581,7 @@ hist_entry__cmp_compute_idx(struct hist_entry *left, struct hist_entry *right, ...@@ -564,7 +581,7 @@ hist_entry__cmp_compute_idx(struct hist_entry *left, struct hist_entry *right,
if (!p_left || !p_right) if (!p_left || !p_right)
return p_left ? -1 : 1; return p_left ? -1 : 1;
if (c != COMPUTE_DELTA) { if (c != COMPUTE_DELTA && c != COMPUTE_DELTA_ABS) {
/* /*
* The delta can be computed without the baseline, but * The delta can be computed without the baseline, but
* others are not. Put those entries which have no * others are not. Put those entries which have no
...@@ -606,6 +623,15 @@ hist_entry__cmp_delta(struct perf_hpp_fmt *fmt, ...@@ -606,6 +623,15 @@ hist_entry__cmp_delta(struct perf_hpp_fmt *fmt,
return hist_entry__cmp_compute(right, left, COMPUTE_DELTA, d->idx); return hist_entry__cmp_compute(right, left, COMPUTE_DELTA, d->idx);
} }
static int64_t
hist_entry__cmp_delta_abs(struct perf_hpp_fmt *fmt,
struct hist_entry *left, struct hist_entry *right)
{
struct data__file *d = fmt_to_data_file(fmt);
return hist_entry__cmp_compute(right, left, COMPUTE_DELTA_ABS, d->idx);
}
static int64_t static int64_t
hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt, hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt,
struct hist_entry *left, struct hist_entry *right) struct hist_entry *left, struct hist_entry *right)
...@@ -632,6 +658,14 @@ hist_entry__cmp_delta_idx(struct perf_hpp_fmt *fmt __maybe_unused, ...@@ -632,6 +658,14 @@ hist_entry__cmp_delta_idx(struct perf_hpp_fmt *fmt __maybe_unused,
sort_compute); sort_compute);
} }
static int64_t
hist_entry__cmp_delta_abs_idx(struct perf_hpp_fmt *fmt __maybe_unused,
struct hist_entry *left, struct hist_entry *right)
{
return hist_entry__cmp_compute_idx(right, left, COMPUTE_DELTA_ABS,
sort_compute);
}
static int64_t static int64_t
hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused, hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused,
struct hist_entry *left, struct hist_entry *right) struct hist_entry *left, struct hist_entry *right)
...@@ -775,7 +809,7 @@ static const struct option options[] = { ...@@ -775,7 +809,7 @@ static const struct option options[] = {
OPT_BOOLEAN('b', "baseline-only", &show_baseline_only, OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
"Show only items with match in baseline"), "Show only items with match in baseline"),
OPT_CALLBACK('c', "compute", &compute, OPT_CALLBACK('c', "compute", &compute,
"delta,ratio,wdiff:w1,w2 (default delta)", "delta,delta-abs,ratio,wdiff:w1,w2 (default delta)",
"Entries differential computation selection", "Entries differential computation selection",
setup_compute), setup_compute),
OPT_BOOLEAN('p', "period", &show_period, OPT_BOOLEAN('p', "period", &show_period,
...@@ -945,6 +979,7 @@ hpp__entry_pair(struct hist_entry *he, struct hist_entry *pair, ...@@ -945,6 +979,7 @@ hpp__entry_pair(struct hist_entry *he, struct hist_entry *pair,
switch (idx) { switch (idx) {
case PERF_HPP_DIFF__DELTA: case PERF_HPP_DIFF__DELTA:
case PERF_HPP_DIFF__DELTA_ABS:
if (pair->diff.computed) if (pair->diff.computed)
diff = pair->diff.period_ratio_delta; diff = pair->diff.period_ratio_delta;
else else
...@@ -1118,6 +1153,10 @@ static void data__hpp_register(struct data__file *d, int idx) ...@@ -1118,6 +1153,10 @@ static void data__hpp_register(struct data__file *d, int idx)
fmt->color = hpp__color_wdiff; fmt->color = hpp__color_wdiff;
fmt->sort = hist_entry__cmp_wdiff; fmt->sort = hist_entry__cmp_wdiff;
break; break;
case PERF_HPP_DIFF__DELTA_ABS:
fmt->color = hpp__color_delta;
fmt->sort = hist_entry__cmp_delta_abs;
break;
default: default:
fmt->sort = hist_entry__cmp_nop; fmt->sort = hist_entry__cmp_nop;
break; break;
...@@ -1195,6 +1234,9 @@ static int ui_init(void) ...@@ -1195,6 +1234,9 @@ static int ui_init(void)
case COMPUTE_WEIGHTED_DIFF: case COMPUTE_WEIGHTED_DIFF:
fmt->sort = hist_entry__cmp_wdiff_idx; fmt->sort = hist_entry__cmp_wdiff_idx;
break; break;
case COMPUTE_DELTA_ABS:
fmt->sort = hist_entry__cmp_delta_abs_idx;
break;
default: default:
BUG_ON(1); BUG_ON(1);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment