perf stat: Add --sync/-S option
Ingo Molnar [Thu, 28 Apr 2011 16:17:11 +0000 (18:17 +0200)]
--sync will tell perf stat to run sync() before starting a command.

This allows IO-heavy tests to be used with --repeat, without one
iteration impacting the other.

Elapsed time will stabilize for example:

  before:        3.971525714  seconds time elapsed  ( +-  8.56% )
  after:         3.211098537  seconds time elapsed  ( +-  1.52% )

So measurements will be more accurate.

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Link: http://lkml.kernel.org/n/tip-7y40wib8n1eqio7hjpn1dsrm@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>

tools/perf/builtin-stat.c

index 003caa8..5658a77 100644 (file)
@@ -128,6 +128,7 @@ static pid_t                        target_tid                      = -1;
 static pid_t                   child_pid                       = -1;
 static bool                    null_run                        =  false;
 static bool                    detailed_run                    =  false;
+static bool                    sync_run                        =  false;
 static bool                    big_num                         =  true;
 static int                     big_num_opt                     =  -1;
 static const char              *cpu_list;
@@ -819,6 +820,8 @@ static const struct option options[] = {
                    "null run - dont start any counters"),
        OPT_BOOLEAN('d', "detailed", &detailed_run,
                    "detailed run - start a lot of events"),
+       OPT_BOOLEAN('S', "sync", &sync_run,
+                   "call sync() before starting a run"),
        OPT_CALLBACK_NOOPT('B', "big-num", NULL, NULL, 
                           "print large numbers with thousands\' separators",
                           stat__set_big_num),
@@ -944,6 +947,10 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
        for (run_idx = 0; run_idx < run_count; run_idx++) {
                if (run_count != 1 && verbose)
                        fprintf(stderr, "[ perf stat: executing run #%d ... ]\n", run_idx + 1);
+
+               if (sync_run)
+                       sync();
+
                status = run_perf_stat(argc, argv);
        }