Skip to content
Snippets Groups Projects
Commit 55629e0a authored by Hauke Petersen's avatar Hauke Petersen
Browse files

sys: added simple benchmark module

parent 197abe8b
No related branches found
No related tags found
No related merge requests found
...@@ -679,6 +679,10 @@ ifneq (,$(filter fatfs_vfs,$(USEMODULE))) ...@@ -679,6 +679,10 @@ ifneq (,$(filter fatfs_vfs,$(USEMODULE)))
USEMODULE += vfs USEMODULE += vfs
endif endif
ifneq (,$(filter benchmark,$(USEMODULE)))
USEMODULE += xtimer
endif
# always select gpio (until explicit dependencies are sorted out) # always select gpio (until explicit dependencies are sorted out)
FEATURES_OPTIONAL += periph_gpio FEATURES_OPTIONAL += periph_gpio
......
include $(RIOTBASE)/Makefile.base
/*
* 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);
}
/*
* 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 */
/** @} */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment