perf report: Print percentage of each event statistics
authorNamhyung Kim <namhyung@kernel.org>
Tue, 27 Apr 2021 01:37:17 +0000 (18:37 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 29 Apr 2021 13:30:59 +0000 (10:30 -0300)
It's sometimes useful to see how many samples vs other events in the
data file with percent values.

  $ perf report --stat

  Aggregated stats:
             TOTAL events:      20064
              MMAP events:        239  ( 1.2%)
              COMM events:       1518  ( 7.6%)
              EXIT events:          1  ( 0.0%)
              FORK events:       1517  ( 7.6%)
            SAMPLE events:       4015  (20.0%)
             MMAP2 events:      12769  (63.6%)
    FINISHED_ROUND events:          2  ( 0.0%)
        THREAD_MAP events:          1  ( 0.0%)
           CPU_MAP events:          1  ( 0.0%)
         TIME_CONV events:          1  ( 0.0%)
  cycles stats:
            SAMPLE events:       2475
  instructions stats:
            SAMPLE events:       1540

Suggested-by: Andi Kleen <ak@linux.intel.com>
Reviewed-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210427013717.1651674-7-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/ui/stdio/hist.c

index d9e6344..f362704 100644 (file)
@@ -902,6 +902,7 @@ size_t events_stats__fprintf(struct events_stats *stats, FILE *fp,
 {
        int i;
        size_t ret = 0;
+       u32 total = stats->nr_events[0];
 
        for (i = 0; i < PERF_RECORD_HEADER_MAX; ++i) {
                const char *name;
@@ -912,7 +913,14 @@ size_t events_stats__fprintf(struct events_stats *stats, FILE *fp,
                if (skip_empty && !stats->nr_events[i])
                        continue;
 
-               ret += fprintf(fp, "%16s events: %10d\n", name, stats->nr_events[i]);
+               if (i && total) {
+                       ret += fprintf(fp, "%16s events: %10d  (%4.1f%%)\n",
+                                      name, stats->nr_events[i],
+                                      100.0 * stats->nr_events[i] / total);
+               } else {
+                       ret += fprintf(fp, "%16s events: %10d\n",
+                                      name, stats->nr_events[i]);
+               }
        }
 
        return ret;