aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-diff.c
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2017-02-10 02:36:11 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-02-13 12:29:36 -0500
commita1668c25a8e1b53d00b2997ef5bc5e25c7a77235 (patch)
treee936877b49c859768551202bac2f190537f0aeec /tools/perf/builtin-diff.c
parent192614010a5052fe92611c7076ef664fd9bb60e8 (diff)
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>
Diffstat (limited to 'tools/perf/builtin-diff.c')
-rw-r--r--tools/perf/builtin-diff.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index 933aeec46f4a..781c9e60bd21 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -30,6 +30,7 @@ enum {
30 PERF_HPP_DIFF__RATIO, 30 PERF_HPP_DIFF__RATIO,
31 PERF_HPP_DIFF__WEIGHTED_DIFF, 31 PERF_HPP_DIFF__WEIGHTED_DIFF,
32 PERF_HPP_DIFF__FORMULA, 32 PERF_HPP_DIFF__FORMULA,
33 PERF_HPP_DIFF__DELTA_ABS,
33 34
34 PERF_HPP_DIFF__MAX_INDEX 35 PERF_HPP_DIFF__MAX_INDEX
35}; 36};
@@ -73,11 +74,13 @@ enum {
73 COMPUTE_DELTA, 74 COMPUTE_DELTA,
74 COMPUTE_RATIO, 75 COMPUTE_RATIO,
75 COMPUTE_WEIGHTED_DIFF, 76 COMPUTE_WEIGHTED_DIFF,
77 COMPUTE_DELTA_ABS,
76 COMPUTE_MAX, 78 COMPUTE_MAX,
77}; 79};
78 80
79const char *compute_names[COMPUTE_MAX] = { 81const char *compute_names[COMPUTE_MAX] = {
80 [COMPUTE_DELTA] = "delta", 82 [COMPUTE_DELTA] = "delta",
83 [COMPUTE_DELTA_ABS] = "delta-abs",
81 [COMPUTE_RATIO] = "ratio", 84 [COMPUTE_RATIO] = "ratio",
82 [COMPUTE_WEIGHTED_DIFF] = "wdiff", 85 [COMPUTE_WEIGHTED_DIFF] = "wdiff",
83}; 86};
@@ -86,6 +89,7 @@ static int compute;
86 89
87static int compute_2_hpp[COMPUTE_MAX] = { 90static int compute_2_hpp[COMPUTE_MAX] = {
88 [COMPUTE_DELTA] = PERF_HPP_DIFF__DELTA, 91 [COMPUTE_DELTA] = PERF_HPP_DIFF__DELTA,
92 [COMPUTE_DELTA_ABS] = PERF_HPP_DIFF__DELTA_ABS,
89 [COMPUTE_RATIO] = PERF_HPP_DIFF__RATIO, 93 [COMPUTE_RATIO] = PERF_HPP_DIFF__RATIO,
90 [COMPUTE_WEIGHTED_DIFF] = PERF_HPP_DIFF__WEIGHTED_DIFF, 94 [COMPUTE_WEIGHTED_DIFF] = PERF_HPP_DIFF__WEIGHTED_DIFF,
91}; 95};
@@ -111,6 +115,10 @@ static struct header_column {
111 .name = "Delta", 115 .name = "Delta",
112 .width = 7, 116 .width = 7,
113 }, 117 },
118 [PERF_HPP_DIFF__DELTA_ABS] = {
119 .name = "Delta Abs",
120 .width = 7,
121 },
114 [PERF_HPP_DIFF__RATIO] = { 122 [PERF_HPP_DIFF__RATIO] = {
115 .name = "Ratio", 123 .name = "Ratio",
116 .width = 14, 124 .width = 14,
@@ -298,6 +306,7 @@ static int formula_fprintf(struct hist_entry *he, struct hist_entry *pair,
298{ 306{
299 switch (compute) { 307 switch (compute) {
300 case COMPUTE_DELTA: 308 case COMPUTE_DELTA:
309 case COMPUTE_DELTA_ABS:
301 return formula_delta(he, pair, buf, size); 310 return formula_delta(he, pair, buf, size);
302 case COMPUTE_RATIO: 311 case COMPUTE_RATIO:
303 return formula_ratio(he, pair, buf, size); 312 return formula_ratio(he, pair, buf, size);
@@ -461,6 +470,7 @@ static void hists__precompute(struct hists *hists)
461 470
462 switch (compute) { 471 switch (compute) {
463 case COMPUTE_DELTA: 472 case COMPUTE_DELTA:
473 case COMPUTE_DELTA_ABS:
464 compute_delta(he, pair); 474 compute_delta(he, pair);
465 break; 475 break;
466 case COMPUTE_RATIO: 476 case COMPUTE_RATIO:
@@ -498,6 +508,13 @@ __hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right,
498 508
499 return cmp_doubles(l, r); 509 return cmp_doubles(l, r);
500 } 510 }
511 case COMPUTE_DELTA_ABS:
512 {
513 double l = fabs(left->diff.period_ratio_delta);
514 double r = fabs(right->diff.period_ratio_delta);
515
516 return cmp_doubles(l, r);
517 }
501 case COMPUTE_RATIO: 518 case COMPUTE_RATIO:
502 { 519 {
503 double l = left->diff.period_ratio; 520 double l = left->diff.period_ratio;
@@ -564,7 +581,7 @@ hist_entry__cmp_compute_idx(struct hist_entry *left, struct hist_entry *right,
564 if (!p_left || !p_right) 581 if (!p_left || !p_right)
565 return p_left ? -1 : 1; 582 return p_left ? -1 : 1;
566 583
567 if (c != COMPUTE_DELTA) { 584 if (c != COMPUTE_DELTA && c != COMPUTE_DELTA_ABS) {
568 /* 585 /*
569 * The delta can be computed without the baseline, but 586 * The delta can be computed without the baseline, but
570 * others are not. Put those entries which have no 587 * others are not. Put those entries which have no
@@ -607,6 +624,15 @@ hist_entry__cmp_delta(struct perf_hpp_fmt *fmt,
607} 624}
608 625
609static int64_t 626static int64_t
627hist_entry__cmp_delta_abs(struct perf_hpp_fmt *fmt,
628 struct hist_entry *left, struct hist_entry *right)
629{
630 struct data__file *d = fmt_to_data_file(fmt);
631
632 return hist_entry__cmp_compute(right, left, COMPUTE_DELTA_ABS, d->idx);
633}
634
635static int64_t
610hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt, 636hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt,
611 struct hist_entry *left, struct hist_entry *right) 637 struct hist_entry *left, struct hist_entry *right)
612{ 638{
@@ -633,6 +659,14 @@ hist_entry__cmp_delta_idx(struct perf_hpp_fmt *fmt __maybe_unused,
633} 659}
634 660
635static int64_t 661static int64_t
662hist_entry__cmp_delta_abs_idx(struct perf_hpp_fmt *fmt __maybe_unused,
663 struct hist_entry *left, struct hist_entry *right)
664{
665 return hist_entry__cmp_compute_idx(right, left, COMPUTE_DELTA_ABS,
666 sort_compute);
667}
668
669static int64_t
636hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused, 670hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused,
637 struct hist_entry *left, struct hist_entry *right) 671 struct hist_entry *left, struct hist_entry *right)
638{ 672{
@@ -775,7 +809,7 @@ static const struct option options[] = {
775 OPT_BOOLEAN('b', "baseline-only", &show_baseline_only, 809 OPT_BOOLEAN('b', "baseline-only", &show_baseline_only,
776 "Show only items with match in baseline"), 810 "Show only items with match in baseline"),
777 OPT_CALLBACK('c', "compute", &compute, 811 OPT_CALLBACK('c', "compute", &compute,
778 "delta,ratio,wdiff:w1,w2 (default delta)", 812 "delta,delta-abs,ratio,wdiff:w1,w2 (default delta)",
779 "Entries differential computation selection", 813 "Entries differential computation selection",
780 setup_compute), 814 setup_compute),
781 OPT_BOOLEAN('p', "period", &show_period, 815 OPT_BOOLEAN('p', "period", &show_period,
@@ -945,6 +979,7 @@ hpp__entry_pair(struct hist_entry *he, struct hist_entry *pair,
945 979
946 switch (idx) { 980 switch (idx) {
947 case PERF_HPP_DIFF__DELTA: 981 case PERF_HPP_DIFF__DELTA:
982 case PERF_HPP_DIFF__DELTA_ABS:
948 if (pair->diff.computed) 983 if (pair->diff.computed)
949 diff = pair->diff.period_ratio_delta; 984 diff = pair->diff.period_ratio_delta;
950 else 985 else
@@ -1118,6 +1153,10 @@ static void data__hpp_register(struct data__file *d, int idx)
1118 fmt->color = hpp__color_wdiff; 1153 fmt->color = hpp__color_wdiff;
1119 fmt->sort = hist_entry__cmp_wdiff; 1154 fmt->sort = hist_entry__cmp_wdiff;
1120 break; 1155 break;
1156 case PERF_HPP_DIFF__DELTA_ABS:
1157 fmt->color = hpp__color_delta;
1158 fmt->sort = hist_entry__cmp_delta_abs;
1159 break;
1121 default: 1160 default:
1122 fmt->sort = hist_entry__cmp_nop; 1161 fmt->sort = hist_entry__cmp_nop;
1123 break; 1162 break;
@@ -1195,6 +1234,9 @@ static int ui_init(void)
1195 case COMPUTE_WEIGHTED_DIFF: 1234 case COMPUTE_WEIGHTED_DIFF:
1196 fmt->sort = hist_entry__cmp_wdiff_idx; 1235 fmt->sort = hist_entry__cmp_wdiff_idx;
1197 break; 1236 break;
1237 case COMPUTE_DELTA_ABS:
1238 fmt->sort = hist_entry__cmp_delta_abs_idx;
1239 break;
1198 default: 1240 default:
1199 BUG_ON(1); 1241 BUG_ON(1);
1200 } 1242 }