| // 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(); | |
| } |