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
18/*
19 * Identifier builders for the linker-visible symbols that the ZTEST_BENCHMARK*()
20 * macros generate. Use when defining a symbol or when taking its reference.
21 */
22#define Z_ZTEST_BENCHMARK_SUITE_NODE(suite) z_ztest_benchmark_suite_##suite
23#define Z_ZTEST_BENCHMARK_NODE(suite, bench) z_ztest_benchmark_##suite##_##bench
24#define Z_ZTEST_BENCHMARK_TIMED_NODE(suite, bench) z_ztest_benchmark_timed_##suite##_##bench
25#define Z_ZTEST_BENCHMARK_FN(suite, bench) z_ztest_benchmark_##suite##_##bench##_fn
26
27typedef void (*ztest_benchmark_fn_t)(void);
28struct ztest_benchmark_suite {
29 const char *name;
30 ztest_benchmark_fn_t setup;
31 ztest_benchmark_fn_t teardown;
32};
33
34struct ztest_extreme_value {
35 uint64_t value;
36 uint64_t sample;
37};
38
39struct ztest_benchmark_stats {
40 double m2;
41 double mean;
42 uint64_t total;
43 uint64_t samples;
44 struct ztest_extreme_value min;
45 struct ztest_extreme_value max;
46};
47
48struct ztest_benchmark {
49 const char *name;
50 size_t iterations;
51 ztest_benchmark_fn_t setup;
52 ztest_benchmark_fn_t run;
53 ztest_benchmark_fn_t teardown;
54 struct ztest_benchmark_stats stats;
55 const struct ztest_benchmark_suite *suite;
56};
57
58struct ztest_benchmark_timed_stats {
59 uint64_t iterations;
60 uint64_t duration_cycles;
61};
62
63struct ztest_benchmark_timed {
64 size_t duration_ms;
65 const char *name;
66 ztest_benchmark_fn_t setup;
67 ztest_benchmark_fn_t run;
68 ztest_benchmark_fn_t teardown;
69 const struct ztest_benchmark_suite *suite;
70 struct ztest_benchmark_timed_stats stats;
71};
72
73void benchmark_main(void);
75
81
89#define ZTEST_BENCHMARK_SUITE(suite, setup_fn, teardown_fn) \
90 static const STRUCT_SECTION_ITERABLE(ztest_benchmark_suite, \
91 Z_ZTEST_BENCHMARK_SUITE_NODE(suite)) = \
92 { \
93 .name = #suite, \
94 .setup = setup_fn, \
95 .teardown = teardown_fn, \
96 }
97
107#define ZTEST_BENCHMARK(suite_name, benchmark, samples, setup_fn, teardown_fn) \
108 static __noinline void Z_ZTEST_BENCHMARK_FN(suite_name, benchmark)(void); \
109 static const STRUCT_SECTION_ITERABLE(ztest_benchmark, \
110 Z_ZTEST_BENCHMARK_NODE(suite_name, benchmark)) = \
111 { \
112 .name = #benchmark, \
113 .iterations = samples, \
114 .setup = setup_fn, \
115 .teardown = teardown_fn, \
116 .run = Z_ZTEST_BENCHMARK_FN(suite_name, benchmark), \
117 .suite = &Z_ZTEST_BENCHMARK_SUITE_NODE(suite_name), \
118 }; \
119 static __noinline void Z_ZTEST_BENCHMARK_FN(suite_name, benchmark)(void)
120
121
131#define ZTEST_BENCHMARK_TIMED(testsuite, benchmark, duration, setup_fn, teardown_fn) \
132 static __noinline void Z_ZTEST_BENCHMARK_FN(testsuite, benchmark)(void); \
133 static const STRUCT_SECTION_ITERABLE(ztest_benchmark_timed, \
134 Z_ZTEST_BENCHMARK_TIMED_NODE(testsuite, benchmark)) = \
135 { \
136 .name = #benchmark, \
137 .duration_ms = duration, \
138 .setup = setup_fn, \
139 .run = Z_ZTEST_BENCHMARK_FN(testsuite, benchmark), \
140 .teardown = teardown_fn, \
141 .suite = &Z_ZTEST_BENCHMARK_SUITE_NODE(testsuite), \
142 }; \
143 static __noinline void Z_ZTEST_BENCHMARK_FN(testsuite, benchmark)(void)
144
148#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