kallsyms-parse.c (1727B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Benchmark of /proc/kallsyms parsing. 4 * 5 * Copyright 2020 Google LLC. 6 */ 7#include <stdlib.h> 8#include "bench.h" 9#include "../util/stat.h" 10#include <linux/time64.h> 11#include <subcmd/parse-options.h> 12#include <symbol/kallsyms.h> 13 14static unsigned int iterations = 100; 15 16static const struct option options[] = { 17 OPT_UINTEGER('i', "iterations", &iterations, 18 "Number of iterations used to compute average"), 19 OPT_END() 20}; 21 22static const char *const bench_usage[] = { 23 "perf bench internals kallsyms-parse <options>", 24 NULL 25}; 26 27static int bench_process_symbol(void *arg __maybe_unused, 28 const char *name __maybe_unused, 29 char type __maybe_unused, 30 u64 start __maybe_unused) 31{ 32 return 0; 33} 34 35static int do_kallsyms_parse(void) 36{ 37 struct timeval start, end, diff; 38 u64 runtime_us; 39 unsigned int i; 40 double time_average, time_stddev; 41 int err; 42 struct stats time_stats; 43 44 init_stats(&time_stats); 45 46 for (i = 0; i < iterations; i++) { 47 gettimeofday(&start, NULL); 48 err = kallsyms__parse("/proc/kallsyms", NULL, 49 bench_process_symbol); 50 if (err) 51 return err; 52 53 gettimeofday(&end, NULL); 54 timersub(&end, &start, &diff); 55 runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec; 56 update_stats(&time_stats, runtime_us); 57 } 58 59 time_average = avg_stats(&time_stats) / USEC_PER_MSEC; 60 time_stddev = stddev_stats(&time_stats) / USEC_PER_MSEC; 61 printf(" Average kallsyms__parse took: %.3f ms (+- %.3f ms)\n", 62 time_average, time_stddev); 63 return 0; 64} 65 66int bench_kallsyms_parse(int argc, const char **argv) 67{ 68 argc = parse_options(argc, argv, options, bench_usage, 0); 69 if (argc) { 70 usage_with_options(bench_usage, options); 71 exit(EXIT_FAILURE); 72 } 73 74 return do_kallsyms_parse(); 75}