sys: added simple benchmark module
This commit is contained in:
parent
197abe8bd1
commit
55629e0a1c
@ -679,6 +679,10 @@ ifneq (,$(filter fatfs_vfs,$(USEMODULE)))
|
||||
USEMODULE += vfs
|
||||
endif
|
||||
|
||||
ifneq (,$(filter benchmark,$(USEMODULE)))
|
||||
USEMODULE += xtimer
|
||||
endif
|
||||
|
||||
# always select gpio (until explicit dependencies are sorted out)
|
||||
FEATURES_OPTIONAL += periph_gpio
|
||||
|
||||
|
||||
1
sys/benchmark/Makefile
Normal file
1
sys/benchmark/Makefile
Normal file
@ -0,0 +1 @@
|
||||
include $(RIOTBASE)/Makefile.base
|
||||
32
sys/benchmark/benchmark.c
Normal file
32
sys/benchmark/benchmark.c
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser General
|
||||
* Public License v2.1. See the file LICENSE in the top level directory for more
|
||||
* details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup sys_benchmark
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Utility functions for the benchmark module
|
||||
*
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "benchmark.h"
|
||||
|
||||
void benchmark_print_time(uint32_t time, unsigned long runs, const char *name)
|
||||
{
|
||||
uint32_t full = (time / runs);
|
||||
uint32_t div = (time - (full * runs)) / (runs / 1000);
|
||||
|
||||
printf("%11s: %9" PRIu32 "us --- %2" PRIu32 ".%03" PRIu32 "us per call\n",
|
||||
name, time, full, div);
|
||||
}
|
||||
76
sys/include/benchmark.h
Normal file
76
sys/include/benchmark.h
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Freie Universität Berlin
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup sys_benchmark Benchmark
|
||||
* @ingroup sys
|
||||
* @brief Framework for running simple runtime benchmarks
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Interface for running simple benchmarks
|
||||
*
|
||||
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
||||
*/
|
||||
|
||||
#ifndef BENCHMARK_H
|
||||
#define BENCHMARK_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "xtimer.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Prepare the current scope for running BENCHMARK_x() macros
|
||||
*/
|
||||
#define BENCHMARK_SETUP() \
|
||||
unsigned state; \
|
||||
unsigned time
|
||||
|
||||
/**
|
||||
* @brief Measure the runtime of a given function call
|
||||
*
|
||||
* As we are doing a time sensitive measurement here, there is no way around
|
||||
* using a preprocessor function, as going with a function pointer or similar
|
||||
* would influence the measured runtime...
|
||||
*
|
||||
* @note BENCHMARK_SETUP() needs to be called in the same scope
|
||||
*
|
||||
* @param[in] name name for labeling the output
|
||||
* @param[in] runs number of times to run @p func
|
||||
* @param[in] func function call to benchmark
|
||||
*/
|
||||
#define BENCHMARK_FUNC(name, runs, func) \
|
||||
state = irq_disable(); \
|
||||
time = xtimer_now_usec(); \
|
||||
for (unsigned long i = 0; i < runs; i++) { \
|
||||
func; \
|
||||
} \
|
||||
time = (xtimer_now_usec() - time); \
|
||||
irq_restore(state); \
|
||||
benchmark_print_time(time, runs, name)
|
||||
|
||||
/**
|
||||
* @brief Output the given time as well as the time per run on STDIO
|
||||
*
|
||||
* @param[in] time overall runtime in us
|
||||
* @param[in] runs number of runs
|
||||
* @param[in] name name to label the output
|
||||
*/
|
||||
void benchmark_print_time(uint32_t time, unsigned long runs, const char *name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* BENCHMARK_H */
|
||||
/** @} */
|
||||
Loading…
x
Reference in New Issue
Block a user