diff options
Diffstat (limited to 'tools/perf/builtin-diff.c')
-rw-r--r-- | tools/perf/builtin-diff.c | 98 |
1 files changed, 94 insertions, 4 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index e6a0844bc2f0..a77e31246c00 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c | |||
@@ -356,9 +356,10 @@ static struct perf_evsel *evsel_match(struct perf_evsel *evsel, | |||
356 | { | 356 | { |
357 | struct perf_evsel *e; | 357 | struct perf_evsel *e; |
358 | 358 | ||
359 | list_for_each_entry(e, &evlist->entries, node) | 359 | evlist__for_each(evlist, e) { |
360 | if (perf_evsel__match2(evsel, e)) | 360 | if (perf_evsel__match2(evsel, e)) |
361 | return e; | 361 | return e; |
362 | } | ||
362 | 363 | ||
363 | return NULL; | 364 | return NULL; |
364 | } | 365 | } |
@@ -367,7 +368,7 @@ static void perf_evlist__collapse_resort(struct perf_evlist *evlist) | |||
367 | { | 368 | { |
368 | struct perf_evsel *evsel; | 369 | struct perf_evsel *evsel; |
369 | 370 | ||
370 | list_for_each_entry(evsel, &evlist->entries, node) { | 371 | evlist__for_each(evlist, evsel) { |
371 | struct hists *hists = &evsel->hists; | 372 | struct hists *hists = &evsel->hists; |
372 | 373 | ||
373 | hists__collapse_resort(hists, NULL); | 374 | hists__collapse_resort(hists, NULL); |
@@ -614,7 +615,7 @@ static void data_process(void) | |||
614 | struct perf_evsel *evsel_base; | 615 | struct perf_evsel *evsel_base; |
615 | bool first = true; | 616 | bool first = true; |
616 | 617 | ||
617 | list_for_each_entry(evsel_base, &evlist_base->entries, node) { | 618 | evlist__for_each(evlist_base, evsel_base) { |
618 | struct data__file *d; | 619 | struct data__file *d; |
619 | int i; | 620 | int i; |
620 | 621 | ||
@@ -769,6 +770,81 @@ static int hpp__entry_baseline(struct hist_entry *he, char *buf, size_t size) | |||
769 | return ret; | 770 | return ret; |
770 | } | 771 | } |
771 | 772 | ||
773 | static int __hpp__color_compare(struct perf_hpp_fmt *fmt, | ||
774 | struct perf_hpp *hpp, struct hist_entry *he, | ||
775 | int comparison_method) | ||
776 | { | ||
777 | struct diff_hpp_fmt *dfmt = | ||
778 | container_of(fmt, struct diff_hpp_fmt, fmt); | ||
779 | struct hist_entry *pair = get_pair_fmt(he, dfmt); | ||
780 | double diff; | ||
781 | s64 wdiff; | ||
782 | char pfmt[20] = " "; | ||
783 | |||
784 | if (!pair) | ||
785 | goto dummy_print; | ||
786 | |||
787 | switch (comparison_method) { | ||
788 | case COMPUTE_DELTA: | ||
789 | if (pair->diff.computed) | ||
790 | diff = pair->diff.period_ratio_delta; | ||
791 | else | ||
792 | diff = compute_delta(he, pair); | ||
793 | |||
794 | if (fabs(diff) < 0.01) | ||
795 | goto dummy_print; | ||
796 | scnprintf(pfmt, 20, "%%%+d.2f%%%%", dfmt->header_width - 1); | ||
797 | return percent_color_snprintf(hpp->buf, hpp->size, | ||
798 | pfmt, diff); | ||
799 | case COMPUTE_RATIO: | ||
800 | if (he->dummy) | ||
801 | goto dummy_print; | ||
802 | if (pair->diff.computed) | ||
803 | diff = pair->diff.period_ratio; | ||
804 | else | ||
805 | diff = compute_ratio(he, pair); | ||
806 | |||
807 | scnprintf(pfmt, 20, "%%%d.6f", dfmt->header_width); | ||
808 | return value_color_snprintf(hpp->buf, hpp->size, | ||
809 | pfmt, diff); | ||
810 | case COMPUTE_WEIGHTED_DIFF: | ||
811 | if (he->dummy) | ||
812 | goto dummy_print; | ||
813 | if (pair->diff.computed) | ||
814 | wdiff = pair->diff.wdiff; | ||
815 | else | ||
816 | wdiff = compute_wdiff(he, pair); | ||
817 | |||
818 | scnprintf(pfmt, 20, "%%14ld", dfmt->header_width); | ||
819 | return color_snprintf(hpp->buf, hpp->size, | ||
820 | get_percent_color(wdiff), | ||
821 | pfmt, wdiff); | ||
822 | default: | ||
823 | BUG_ON(1); | ||
824 | } | ||
825 | dummy_print: | ||
826 | return scnprintf(hpp->buf, hpp->size, "%*s", | ||
827 | dfmt->header_width, pfmt); | ||
828 | } | ||
829 | |||
830 | static int hpp__color_delta(struct perf_hpp_fmt *fmt, | ||
831 | struct perf_hpp *hpp, struct hist_entry *he) | ||
832 | { | ||
833 | return __hpp__color_compare(fmt, hpp, he, COMPUTE_DELTA); | ||
834 | } | ||
835 | |||
836 | static int hpp__color_ratio(struct perf_hpp_fmt *fmt, | ||
837 | struct perf_hpp *hpp, struct hist_entry *he) | ||
838 | { | ||
839 | return __hpp__color_compare(fmt, hpp, he, COMPUTE_RATIO); | ||
840 | } | ||
841 | |||
842 | static int hpp__color_wdiff(struct perf_hpp_fmt *fmt, | ||
843 | struct perf_hpp *hpp, struct hist_entry *he) | ||
844 | { | ||
845 | return __hpp__color_compare(fmt, hpp, he, COMPUTE_WEIGHTED_DIFF); | ||
846 | } | ||
847 | |||
772 | static void | 848 | static void |
773 | hpp__entry_unpair(struct hist_entry *he, int idx, char *buf, size_t size) | 849 | hpp__entry_unpair(struct hist_entry *he, int idx, char *buf, size_t size) |
774 | { | 850 | { |
@@ -940,8 +1016,22 @@ static void data__hpp_register(struct data__file *d, int idx) | |||
940 | fmt->entry = hpp__entry_global; | 1016 | fmt->entry = hpp__entry_global; |
941 | 1017 | ||
942 | /* TODO more colors */ | 1018 | /* TODO more colors */ |
943 | if (idx == PERF_HPP_DIFF__BASELINE) | 1019 | switch (idx) { |
1020 | case PERF_HPP_DIFF__BASELINE: | ||
944 | fmt->color = hpp__color_baseline; | 1021 | fmt->color = hpp__color_baseline; |
1022 | break; | ||
1023 | case PERF_HPP_DIFF__DELTA: | ||
1024 | fmt->color = hpp__color_delta; | ||
1025 | break; | ||
1026 | case PERF_HPP_DIFF__RATIO: | ||
1027 | fmt->color = hpp__color_ratio; | ||
1028 | break; | ||
1029 | case PERF_HPP_DIFF__WEIGHTED_DIFF: | ||
1030 | fmt->color = hpp__color_wdiff; | ||
1031 | break; | ||
1032 | default: | ||
1033 | break; | ||
1034 | } | ||
945 | 1035 | ||
946 | init_header(d, dfmt); | 1036 | init_header(d, dfmt); |
947 | perf_hpp__column_register(fmt); | 1037 | perf_hpp__column_register(fmt); |