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