aboutsummaryrefslogtreecommitdiff
path: root/bench/src/Bench.c
diff options
context:
space:
mode:
Diffstat (limited to 'bench/src/Bench.c')
-rw-r--r--bench/src/Bench.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/bench/src/Bench.c b/bench/src/Bench.c
new file mode 100644
index 0000000..613cdbb
--- /dev/null
+++ b/bench/src/Bench.c
@@ -0,0 +1,112 @@
+#include <BH/Bench.h>
+#include <BH/Timer.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+
+struct BH_Bench
+{
+ struct BH_Bench *next;
+ const char *name;
+ BH_BenchCallback cb;
+ int started;
+ size_t iterations;
+};
+
+
+static BH_Bench *root = NULL;
+static BH_Timer *timer = NULL;
+
+
+static void cleanup(void)
+{
+ BH_Bench *current;
+
+ current = root;
+ while (current)
+ {
+ BH_Bench *next = current->next;
+
+ free(current);
+ current = next;
+ }
+}
+
+
+void BH_BenchAdd(const char *name,
+ BH_BenchCallback cb)
+{
+ BH_Bench *bench, *current;
+
+ /* Allocate and fill new benchmark entry */
+ bench = malloc(sizeof(*bench));
+ if (!bench)
+ return;
+
+ bench->next = NULL;
+ bench->name = name;
+ bench->cb = cb;
+ bench->started = 0;
+ bench->iterations = 0;
+
+ /* Append benchmark entry */
+ current = root;
+ while (current && current->next)
+ current = current->next;
+
+ if (current)
+ current->next = bench;
+ else
+ root = bench;
+}
+
+
+int BH_BenchIter(BH_Bench *state)
+{
+ if (state->started)
+ {
+ int64_t millis;
+
+ state->iterations++;
+ millis = BH_TimerMilliseconds(timer);
+
+ if (millis > 1000 && state->iterations > 10)
+ {
+ printf("%s\t%f ips\n", state->name, state->iterations / (millis / 1000.0f));
+ return 0;
+ }
+ }
+ else
+ {
+ state->started = 1;
+ BH_TimerRestart(timer);
+ }
+
+ return 1;
+}
+
+
+int BH_BenchRun(void)
+{
+ BH_Bench *current;
+ int result = 0;
+
+ timer = BH_TimerNew();
+ if (!timer)
+ {
+ printf("ERROR: Can't create timer for benchmarks");
+ return -1;
+ }
+
+ printf("Running benchmarks...\n");
+ current = root;
+ while (current)
+ {
+ current->cb(current);
+ current = current->next;
+ fflush(stdout);
+ }
+
+ cleanup();
+ return 0;
+}