forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.7 KiB
75 lines
1.7 KiB
// 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(); |
|
}
|
|
|