aboutsummaryrefslogtreecommitdiff
path: root/src/timing.h
blob: 44cde56a3edc688af21907922d2719d09636f0ac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#ifndef MACOS_TIMING_H
#define MACOS_TIMING_H

#include <stdint.h>
#include <CoreAudio/CoreAudio.h>

#define BEGIN_SCOPED_TIMED_BLOCK(note) \
    do { \
        struct timing_info timing; \
        if (profile) begin_timing(&timing, note)
#define END_SCOPED_TIMED_BLOCK() \
        if (profile) end_timing(&timing); \
    } while (0)

#define BEGIN_TIMED_BLOCK(note) \
    struct timing_info timing; \
    if (profile) begin_timing(&timing, note)
#define END_TIMED_BLOCK() \
    if (profile) end_timing(&timing)

#define internal static
#define global   static

global bool profile;

struct timing_info
{
    char *note;
    uint64_t start;
    uint64_t end;
    float ms;
};

void begin_timing(struct timing_info *timing, char *note);
void end_timing(struct timing_info *timing);

internal inline uint64_t
macos_get_wall_clock(void)
{
    uint64_t result = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
    return result;
}

internal inline float
macos_get_seconds_elapsed(uint64_t start, uint64_t end)
{
    float result = ((float)(end - start) / 1000.0f) / 1000000.0f;
    return result;
}

internal inline float
macos_get_milliseconds_elapsed(uint64_t start, uint64_t end)
{
    float result = 1000.0f * macos_get_seconds_elapsed(start, end);
    return result;
}

void begin_timing(struct timing_info *timing, char *note) {
    timing->note = note;
    timing->start = macos_get_wall_clock();
}

void end_timing(struct timing_info *timing) {
    timing->end = macos_get_wall_clock();
    timing->ms  = macos_get_milliseconds_elapsed(timing->start, timing->end);
    if (timing->note) {
        printf("%6.4fms (%s)\n", timing->ms, timing->note);
    } else {
        printf("%6.4fms\n", timing->ms);
    }
}

#undef internal
#undef global

#endif