summaryrefslogtreecommitdiff
path: root/include/tinyff/bench
diff options
context:
space:
mode:
Diffstat (limited to 'include/tinyff/bench')
-rw-r--r--include/tinyff/bench/bench.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/include/tinyff/bench/bench.h b/include/tinyff/bench/bench.h
new file mode 100644
index 0000000..f623e0f
--- /dev/null
+++ b/include/tinyff/bench/bench.h
@@ -0,0 +1,80 @@
+#ifdef USE_BENCH
+
+#ifndef TINYFF_BENCH_H_
+#define TINYFF_BENCH_H_
+
+#include <time.h>
+#include <tinyff/result.h>
+
+// Forward declarations
+typedef struct ff_ctx ff_ctx;
+ff_result ff_dprintf(ff_ctx* ctx, const char *msg, ...);
+
+
+#define FF_BENCH_MAX_MARKERS 32
+
+typedef struct ff_ctx ff_ctx;
+
+typedef struct {
+ const char *label;
+ clock_t tick;
+} ff_bench_marker;
+
+typedef struct {
+ const char *label;
+ clock_t _start;
+ clock_t _end;
+
+ ff_bench_marker markers[FF_BENCH_MAX_MARKERS];
+ int _mcount;
+} ff_bench;
+
+// These need to be inline so they are fast
+
+static inline void ff_bench_start(ff_bench *b, const char* label) {
+ b->label = label;
+ b->_start = clock();
+ b->_end = 0;
+ b->_mcount = 0;
+
+}
+
+
+static inline void ff_bench_end(ff_bench *b) {
+ b->_end = clock();
+}
+
+static inline ff_result ff_bench_mark(ff_bench *b, const char *label) {
+ if (b->_mcount >= FF_BENCH_MAX_MARKERS) return FF_RESULT_ERROR_OUT_OF_BOUNDS;
+
+ ff_bench_marker m;
+ m.label = label;
+ m.tick = clock();
+
+ b->markers[b->_mcount] = m;
+ b->_mcount++;
+
+ return FF_RESULT_OK;
+}
+
+static inline double ff_bench_seconds(const ff_bench *b) {
+ return (double)(b->_end - b->_start) / CLOCKS_PER_SEC;
+}
+
+static inline void ff_bench_print(ff_ctx* ctx, const ff_bench *b)
+{
+ double total_ms = (double)(b->_end - b->_start) * 1000.0 / CLOCKS_PER_SEC;
+
+ ff_dprintf(ctx, "== bench: %s ==\n", b->label);
+
+ for (int i = 0; i < b->_mcount; i++) {
+ double ms = (double)(b->markers[i].tick - b->_start) * 1000.0 / CLOCKS_PER_SEC;
+ ff_dprintf(ctx, " [%s] +%.3f ms\n", b->markers[i].label, ms);
+ }
+
+ ff_dprintf(ctx, "total: %.3f ms\n", total_ms);
+}
+
+
+#endif // TINYFF_BENCH_H
+#endif // USE_BENCH \ No newline at end of file