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: Namhyung 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.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
192614010a
commit
a1668c25a8
|
@ -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:
|
||||||
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 {
|
||||||
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 {
|
||||||
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;
|
||||||
|
|
||||||
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 {
|
||||||
.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,
|
||||||
{
|
{
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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[] = {
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue