Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
benchmark.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2025 Måns Ansgariusson <mansgariusson@gmail.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12#ifndef ZTEST_BENCHMARK_H
13#define ZTEST_BENCHMARK_H
14#include <stdint.h>
15#include <stddef.h>
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
22/*
23 * Identifier builders for the linker-visible symbols that the ZTEST_BENCHMARK*()
24 * macros generate. Use when defining a symbol or when taking its reference.
25 */
26#define Z_ZTEST_BENCHMARK_SUITE_NODE(suite) z_ztest_benchmark_suite_##suite
27#define Z_ZTEST_BENCHMARK_NODE(suite, bench) z_ztest_benchmark_##suite##_##bench
28#define Z_ZTEST_BENCHMARK_TIMED_NODE(suite, bench) z_ztest_benchmark_timed_##suite##_##bench
29#define Z_ZTEST_BENCHMARK_FN(suite, bench) z_ztest_benchmark_##suite##_##bench##_fn
30
31typedef void (*ztest_benchmark_fn_t)(void);
32struct ztest_benchmark_suite {
33 const char *name;
34 ztest_benchmark_fn_t setup;
35 ztest_benchmark_fn_t teardown;
36};
37
38struct ztest_extreme_value {
39 uint64_t value;
40 uint64_t sample;
41};
42
43struct ztest_benchmark_stats {
44 double m2;
45 double mean;
46 uint64_t total;
47 uint64_t samples;
48 struct ztest_extreme_value min;
49 struct ztest_extreme_value max;
50};
51
52struct ztest_benchmark {
53 const char *name;
54 size_t iterations;
55 ztest_benchmark_fn_t setup;
56 ztest_benchmark_fn_t run;
57 ztest_benchmark_fn_t teardown;
58 struct ztest_benchmark_stats stats;
59 const struct ztest_benchmark_suite *suite;
60};
61
62struct ztest_benchmark_timed_stats {
63 uint64_t iterations;
64 uint64_t duration_cycles;
65};
66
67struct ztest_benchmark_timed {
68 size_t duration_ms;
69 const char *name;
70 ztest_benchmark_fn_t setup;
71 ztest_benchmark_fn_t run;
72 ztest_benchmark_fn_t teardown;
73 const struct ztest_benchmark_suite *suite;
74 struct ztest_benchmark_timed_stats stats;
75};
76
77void benchmark_main(void);
79
85
93#define ZTEST_BENCHMARK_SUITE(suite, setup_fn, teardown_fn) \
94 static const STRUCT_SECTION_ITERABLE(ztest_benchmark_suite, \
95 Z_ZTEST_BENCHMARK_SUITE_NODE(suite)) = \
96 { \
97 .name = #suite, \
98 .setup = setup_fn, \
99 .teardown = teardown_fn, \
100 }
101
111#define ZTEST_BENCHMARK(suite_name, benchmark, samples, setup_fn, teardown_fn) \
112 static __noinline void Z_ZTEST_BENCHMARK_FN(suite_name, benchmark)(void); \
113 static const STRUCT_SECTION_ITERABLE(ztest_benchmark, \
114 Z_ZTEST_BENCHMARK_NODE(suite_name, benchmark)) = \
115 { \
116 .name = #benchmark, \
117 .iterations = samples, \
118 .setup = setup_fn, \
119 .run = Z_ZTEST_BENCHMARK_FN(suite_name, benchmark), \
120 .teardown = teardown_fn, \
121 .suite = &Z_ZTEST_BENCHMARK_SUITE_NODE(suite_name), \
122 }; \
123 static __noinline void Z_ZTEST_BENCHMARK_FN(suite_name, benchmark)(void)
124
125
135#define ZTEST_BENCHMARK_TIMED(testsuite, benchmark, duration, setup_fn, teardown_fn) \
136 static __noinline void Z_ZTEST_BENCHMARK_FN(testsuite, benchmark)(void); \
137 static const STRUCT_SECTION_ITERABLE(ztest_benchmark_timed, \
138 Z_ZTEST_BENCHMARK_TIMED_NODE(testsuite, benchmark)) = \
139 { \
140 .duration_ms = duration, \
141 .name = #benchmark, \
142 .setup = setup_fn, \
143 .run = Z_ZTEST_BENCHMARK_FN(testsuite, benchmark), \
144 .teardown = teardown_fn, \
145 .suite = &Z_ZTEST_BENCHMARK_SUITE_NODE(testsuite), \
146 }; \
147 static __noinline void Z_ZTEST_BENCHMARK_FN(testsuite, benchmark)(void)
148
152
153#ifdef __cplusplus
154}
155#endif
156
157#endif /* ZTEST_BENCHMARK_H */
#define min(a, b)
Return smaller value of two provided expressions.
Definition minmax.h:81
#define max(a, b)
Return larger value of two provided expressions.
Definition minmax.h:65
__UINT64_TYPE__ uint64_t
Definition stdint.h:91