perf stat: Add --quiet option
authorAndi Kleen <andi@firstfloor.org>
Tue, 27 Oct 2020 00:27:36 +0000 (17:27 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 4 Nov 2020 12:42:41 +0000 (09:42 -0300)
Add a new --quiet option to 'perf stat'. This is useful with 'perf stat
record' to write the data only to the perf.data file, which can lower
measurement overhead because the data doesn't need to be formatted.

On my 4C desktop:

  % time ./perf stat record  -e $(python -c 'print ",".join(["cycles"]*1000)')  -a -I 1000 sleep 5
  ...
  real    0m5.377s
  user    0m0.238s
  sys     0m0.452s
  % time ./perf stat record --quiet -e $(python -c 'print ",".join(["cycles"]*1000)')  -a -I 1000 sleep 5

  real    0m5.452s
  user    0m0.183s
  sys     0m0.423s

In this example it cuts the user time by 20%. On systems with more cores
the savings are higher.

Signed-off-by: Andi Kleen <andi@firstfloor.org>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
Link: http://lore.kernel.org/lkml/20201027002737.30942-1-andi@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-stat.txt
tools/perf/builtin-stat.c
tools/perf/util/stat.h

index 2b44c08b3b2342527a1a70f76b93a1b12a0a5ccd..5d4a673d7621a4da5de63eb76f32a4dd0fe00bc1 100644 (file)
@@ -317,6 +317,10 @@ small group that need not have multiplexing is lowered. This option
 forbids the event merging logic from sharing events between groups and
 may be used to increase accuracy in this case.
 
+--quiet::
+Don't print output. This is useful with perf stat record below to only
+write data to the perf.data file.
+
 STAT RECORD
 -----------
 Stores stat data into perf data file.
index 6709578128c927297dae36cdc3fefc7d27f5e1e7..f15b2f8aa14d8bdd466db1d781f1845adf9cf001 100644 (file)
@@ -972,6 +972,8 @@ static void print_counters(struct timespec *ts, int argc, const char **argv)
        /* Do not print anything if we record to the pipe. */
        if (STAT_RECORD && perf_stat.data.is_pipe)
                return;
+       if (stat_config.quiet)
+               return;
 
        perf_evlist__print_counters(evsel_list, &stat_config, &target,
                                    ts, argc, argv);
@@ -1171,6 +1173,8 @@ static struct option stat_options[] = {
                    "threads of same physical core"),
        OPT_BOOLEAN(0, "summary", &stat_config.summary,
                       "print summary for interval mode"),
+       OPT_BOOLEAN(0, "quiet", &stat_config.quiet,
+                       "don't print output (useful with record)"),
 #ifdef HAVE_LIBPFM
        OPT_CALLBACK(0, "pfm-events", &evsel_list, "event",
                "libpfm4 event selector. use 'perf list' to list available events",
@@ -2132,7 +2136,7 @@ int cmd_stat(int argc, const char **argv)
                goto out;
        }
 
-       if (!output) {
+       if (!output && !stat_config.quiet) {
                struct timespec tm;
                mode = append_file ? "a" : "w";
 
index 487010c624be91b5887341e8caeef53050220467..05adf816502599525ede15d36b52f67ab87a31a7 100644 (file)
@@ -122,6 +122,7 @@ struct perf_stat_config {
        bool                     metric_no_group;
        bool                     metric_no_merge;
        bool                     stop_read_counter;
+       bool                     quiet;
        FILE                    *output;
        unsigned int             interval;
        unsigned int             timeout;