For comparison, it now runs the benchmark twice - one if regular -b
and another for --buildid-all.

  $ perf bench internals inject-build-id
  # Running 'internals/inject-build-id' benchmark:
    Average build-id injection took: 18.112 msec (+- 0.034 msec)
    Average time per event: 1.776 usec (+- 0.003 usec)
    Average memory usage: 7388 KB (+- 6 KB)
    Average build-id-all injection took: 17.504 msec (+- 0.035 msec)
    Average time per event: 1.716 usec (+- 0.003 usec)
    Average memory usage: 7459 KB (+- 2 KB)

Acked-by: Jiri Olsa <[email protected]>
Acked-by: Ian Rogers <[email protected]>
Signed-off-by: Namhyung Kim <[email protected]>
---
 tools/perf/bench/inject-buildid.c | 46 +++++++++++++++++++++----------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/tools/perf/bench/inject-buildid.c 
b/tools/perf/bench/inject-buildid.c
index b09f9126bb4f..02040eff6818 100644
--- a/tools/perf/bench/inject-buildid.c
+++ b/tools/perf/bench/inject-buildid.c
@@ -226,7 +226,7 @@ static void sigpipe_handler(int sig __maybe_unused)
        /* child exited */
 }
 
-static int setup_injection(struct bench_data *data)
+static int setup_injection(struct bench_data *data, bool build_id_all)
 {
        int ready_pipe[2];
        int dev_null_fd;
@@ -247,6 +247,7 @@ static int setup_injection(struct bench_data *data)
 
        if (data->pid == 0) {
                const char **inject_argv;
+               int inject_argc = 2;
 
                close(data->input_pipe[1]);
                close(data->output_pipe[0]);
@@ -263,17 +264,22 @@ static int setup_injection(struct bench_data *data)
 
                dup2(dev_null_fd, STDERR_FILENO);
 
-               inject_argv = calloc(3, sizeof(*inject_argv));
+               if (build_id_all)
+                       inject_argc++;
+
+               inject_argv = calloc(inject_argc + 1, sizeof(*inject_argv));
                if (inject_argv == NULL)
                        exit(1);
 
                inject_argv[0] = strdup("inject");
                inject_argv[1] = strdup("-b");
+               if (build_id_all)
+                       inject_argv[2] = strdup("--buildid-all");
 
                /* signal that we're ready to go */
                close(ready_pipe[1]);
 
-               cmd_inject(2, inject_argv);
+               cmd_inject(inject_argc, inject_argv);
 
                exit(0);
        }
@@ -364,23 +370,17 @@ static int inject_build_id(struct bench_data *data, u64 
*max_rss)
        return 0;
 }
 
-static int do_inject_loop(struct bench_data *data)
+static void do_inject_loop(struct bench_data *data, bool build_id_all)
 {
        unsigned int i;
        struct stats time_stats, mem_stats;
        double time_average, time_stddev;
        double mem_average, mem_stddev;
 
-       srand(time(NULL));
        init_stats(&time_stats);
        init_stats(&mem_stats);
-       symbol__init(NULL);
 
-       collect_dso();
-       if (nr_dsos == 0) {
-               printf("  Cannot collect DSOs for injection\n");
-               return -1;
-       }
+       pr_debug("  Build-id%s injection benchmark\n", build_id_all ? "-all" : 
"");
 
        for (i = 0; i < iterations; i++) {
                struct timeval start, end, diff;
@@ -388,7 +388,7 @@ static int do_inject_loop(struct bench_data *data)
 
                pr_debug("  Iteration #%d\n", i+1);
 
-               if (setup_injection(data) < 0) {
+               if (setup_injection(data, build_id_all) < 0) {
                        printf("  Build-id injection setup failed\n");
                        break;
                }
@@ -408,8 +408,8 @@ static int do_inject_loop(struct bench_data *data)
 
        time_average = avg_stats(&time_stats) / USEC_PER_MSEC;
        time_stddev = stddev_stats(&time_stats) / USEC_PER_MSEC;
-       printf("  Average build-id injection took: %.3f msec (+- %.3f msec)\n",
-               time_average, time_stddev);
+       printf("  Average build-id%s injection took: %.3f msec (+- %.3f 
msec)\n",
+              build_id_all ? "-all" : "", time_average, time_stddev);
 
        /* each iteration, it processes MMAP2 + BUILD_ID + nr_samples * SAMPLE 
*/
        time_average = avg_stats(&time_stats) / (nr_mmaps * (nr_samples + 2));
@@ -421,6 +421,22 @@ static int do_inject_loop(struct bench_data *data)
        mem_stddev = stddev_stats(&mem_stats);
        printf("  Average memory usage: %.0f KB (+- %.0f KB)\n",
                mem_average, mem_stddev);
+}
+
+static int do_inject_loops(struct bench_data *data)
+{
+
+       srand(time(NULL));
+       symbol__init(NULL);
+
+       collect_dso();
+       if (nr_dsos == 0) {
+               printf("  Cannot collect DSOs for injection\n");
+               return -1;
+       }
+
+       do_inject_loop(data, false);
+       do_inject_loop(data, true);
 
        release_dso();
        return 0;
@@ -436,6 +452,6 @@ int bench_inject_build_id(int argc, const char **argv)
                exit(EXIT_FAILURE);
        }
 
-       return do_inject_loop(&data);
+       return do_inject_loops(&data);
 }
 
-- 
2.28.0.681.g6f77f65b4e-goog

Reply via email to