| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Benchmark of /proc/kallsyms parsing.
- *
- * Copyright 2020 Google LLC.
- */
- #include <stdlib.h>
- #include "bench.h"
- #include "../util/stat.h"
- #include <linux/time64.h>
- #include <subcmd/parse-options.h>
- #include <symbol/kallsyms.h>
- static unsigned int iterations = 100;
- static const struct option options[] = {
- OPT_UINTEGER('i', "iterations", &iterations,
- "Number of iterations used to compute average"),
- OPT_END()
- };
- static const char *const bench_usage[] = {
- "perf bench internals kallsyms-parse <options>",
- NULL
- };
- static int bench_process_symbol(void *arg __maybe_unused,
- const char *name __maybe_unused,
- char type __maybe_unused,
- u64 start __maybe_unused)
- {
- return 0;
- }
- static int do_kallsyms_parse(void)
- {
- struct timeval start, end, diff;
- u64 runtime_us;
- unsigned int i;
- double time_average, time_stddev;
- int err;
- struct stats time_stats;
- init_stats(&time_stats);
- for (i = 0; i < iterations; i++) {
- gettimeofday(&start, NULL);
- err = kallsyms__parse("/proc/kallsyms", NULL,
- bench_process_symbol);
- if (err)
- return err;
- gettimeofday(&end, NULL);
- timersub(&end, &start, &diff);
- runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec;
- update_stats(&time_stats, runtime_us);
- }
- time_average = avg_stats(&time_stats) / USEC_PER_MSEC;
- time_stddev = stddev_stats(&time_stats) / USEC_PER_MSEC;
- printf(" Average kallsyms__parse took: %.3f ms (+- %.3f ms)\n",
- time_average, time_stddev);
- return 0;
- }
- int bench_kallsyms_parse(int argc, const char **argv)
- {
- argc = parse_options(argc, argv, options, bench_usage, 0);
- if (argc) {
- usage_with_options(bench_usage, options);
- exit(EXIT_FAILURE);
- }
- return do_kallsyms_parse();
- }
|