aboutsummaryrefslogtreecommitdiff
path: root/src/timings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/timings.c')
-rw-r--r--src/timings.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/timings.c b/src/timings.c
new file mode 100644
index 000000000..a1eecc01a
--- /dev/null
+++ b/src/timings.c
@@ -0,0 +1,105 @@
+typedef struct TimeStamp {
+ u64 start;
+ u64 finish;
+ String label;
+} TimeStamp;
+
+typedef struct Timings {
+ TimeStamp total;
+ Array(TimeStamp) sections;
+ u64 freq;
+} Timings;
+
+
+u64 win32_time_stamp_time_now(void) {
+ LARGE_INTEGER counter;
+ QueryPerformanceCounter(&counter);
+ return counter.QuadPart;
+}
+
+u64 win32_time_stamp__freq(void) {
+ gb_local_persist LARGE_INTEGER win32_perf_count_freq = {0};
+ if (!win32_perf_count_freq.QuadPart) {
+ QueryPerformanceFrequency(&win32_perf_count_freq);
+ GB_ASSERT(win32_perf_count_freq.QuadPart != 0);
+ }
+
+ return win32_perf_count_freq.QuadPart;
+}
+
+u64 time_stamp_time_now(void) {
+#if defined(GB_SYSTEM_WINDOWS)
+ return win32_time_stamp_time_now();
+#else
+#error time_stamp_time_now
+#endif
+}
+
+u64 time_stamp__freq(void) {
+#if defined(GB_SYSTEM_WINDOWS)
+ return win32_time_stamp__freq();
+#else
+#error time_stamp__freq
+#endif
+}
+
+TimeStamp make_time_stamp(String label) {
+ TimeStamp ts = {0};
+ ts.start = time_stamp_time_now();
+ ts.label = label;
+ return ts;
+}
+
+void timings_init(Timings *t, String label, isize buffer_size) {
+ array_init_reserve(&t->sections, heap_allocator(), buffer_size);
+ t->total = make_time_stamp(label);
+ t->freq = time_stamp__freq();
+}
+
+void timings_destroy(Timings *t) {
+ array_free(&t->sections);
+}
+
+void timings__stop_current_section(Timings *t) {
+ if (t->sections.count > 0) {
+ t->sections.e[t->sections.count-1].finish = time_stamp_time_now();
+ }
+}
+
+void timings_start_section(Timings *t, String label) {
+ timings__stop_current_section(t);
+ array_add(&t->sections, make_time_stamp(label));
+}
+
+f64 time_stamp_as_ms(TimeStamp ts, u64 freq) {
+ GB_ASSERT_MSG(ts.finish >= ts.start, "time_stamp_as_ms - %.*s", LIT(ts.label));
+ return 1000.0 * cast(f64)(ts.finish - ts.start) / cast(f64)freq;
+}
+
+void timings_print_all(Timings *t) {
+ timings__stop_current_section(t);
+ t->total.finish = time_stamp_time_now();
+
+ char const SPACES[] = " ";
+
+ isize max_len = t->total.label.len;
+ for_array(i, t->sections) {
+ TimeStamp ts = t->sections.e[i];
+ max_len = gb_max(max_len, ts.label.len);
+ }
+
+ GB_ASSERT(max_len <= gb_size_of(SPACES)-1);
+
+ gb_printf("%.*s%.*s - %.3f ms\n",
+ LIT(t->total.label),
+ cast(int)(max_len-t->total.label.len), SPACES,
+ time_stamp_as_ms(t->total, t->freq));
+
+ for_array(i, t->sections) {
+ TimeStamp ts = t->sections.e[i];
+ gb_printf("%.*s%.*s - %.3f ms\n",
+ LIT(ts.label),
+ cast(int)(max_len-ts.label.len), SPACES,
+ time_stamp_as_ms(ts, t->freq));
+ }
+}