diff options
author | Namhyung Kim <namhyung@kernel.org> | 2017-02-10 02:36:11 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2017-02-13 12:29:36 -0500 |
commit | a1668c25a8e1b53d00b2997ef5bc5e25c7a77235 (patch) | |
tree | e936877b49c859768551202bac2f190537f0aeec /tools/perf/builtin-diff.c | |
parent | 192614010a5052fe92611c7076ef664fd9bb60e8 (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.c | 46 |
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 | ||
79 | const char *compute_names[COMPUTE_MAX] = { | 81 | const 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 | ||
87 | static int compute_2_hpp[COMPUTE_MAX] = { | 90 | static 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 | ||
609 | static int64_t | 626 | static int64_t |
627 | hist_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 | |||
635 | static int64_t | ||
610 | hist_entry__cmp_ratio(struct perf_hpp_fmt *fmt, | 636 | hist_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 | ||
635 | static int64_t | 661 | static int64_t |
662 | hist_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 | |||
669 | static int64_t | ||
636 | hist_entry__cmp_ratio_idx(struct perf_hpp_fmt *fmt __maybe_unused, | 670 | hist_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 | } |