langpackedit: sorting fixes, 0.015 -- from 8f06f769
[wdl.git] / WDL / timing.c
blob6ba94f080afab89bc04e46f2da309d90e5abfeef
1 #include "timing.h"
3 #ifdef TIMING
5 #include <stdio.h>
6 #ifdef _WIN32
7 #include <windows.h>
8 #else
9 #include <sys/time.h>
10 #endif
12 #include "wdlcstring.h"
14 #if defined(__APPLE__) && defined(__OBJC__)
15 #import <Foundation/Foundation.h>
16 #endif
18 static struct {
19 WDL_INT64 st_time;
20 WDL_INT64 cycles,mint,maxt;
21 WDL_INT64 calls;
22 } __wdl_timingInfo[64];
23 static int __wdl_timingInfo_reg;
26 static void __wdl_timingInfo_gettime(WDL_INT64 *t)
28 #ifdef _WIN64
29 #define TIMING_UNITS "QPC_UNITS"
30 LARGE_INTEGER now;
31 QueryPerformanceCounter(&now);
32 *t = now.QuadPart;
33 #elif !defined(_WIN32)
34 #define TIMING_UNITS "uSec"
35 struct timeval tm={0,};
36 gettimeofday(&tm,NULL);
37 *t = ((WDL_INT64)tm.tv_sec)*1000000 + (WDL_INT64)tm.tv_usec;
38 #else
39 #define TIMING_UNITS "cycles"
40 __asm
42 mov esi, t
43 _emit 0xf
44 _emit 0x31
45 mov [esi], eax
46 mov [esi+4], edx
48 #endif
51 void _timingPrint(void)
53 int x,p=0;
54 for (x = 0; x < (int) (sizeof(__wdl_timingInfo)/sizeof(__wdl_timingInfo[0])); x ++)
56 if (__wdl_timingInfo[x].calls)
58 p++;
59 wdl_log("wdl_timing: %d: %.0f calls, %.0f " TIMING_UNITS "/call (min=%.0f, max=%.0f). %.0f " TIMING_UNITS " of CPU time spent\n",
60 x,(double)__wdl_timingInfo[x].calls,(__wdl_timingInfo[x].cycles/(double)__wdl_timingInfo[x].calls),
61 (double)__wdl_timingInfo[x].mint,(double)__wdl_timingInfo[x].maxt,
62 (double)__wdl_timingInfo[x].cycles
66 if (!p) wdl_log("wdl_timing: no calls to timing lib\n");
69 void _timingEnter(int which)
71 if (!__wdl_timingInfo_reg)
73 __wdl_timingInfo_reg=1;
74 atexit(_timingPrint);
77 if (which >= 0 && which < (int) (sizeof(__wdl_timingInfo)/sizeof(__wdl_timingInfo[0])))
78 __wdl_timingInfo_gettime(&__wdl_timingInfo[which].st_time);
81 void _timingLeave(int which)
83 if (which >= 0 && which < (int) (sizeof(__wdl_timingInfo)/sizeof(__wdl_timingInfo[0])))
85 WDL_INT64 t;
86 __wdl_timingInfo_gettime(&t);
87 t -= __wdl_timingInfo[which].st_time;
88 if (!__wdl_timingInfo[which].mint || t < __wdl_timingInfo[which].mint) __wdl_timingInfo[which].mint=t?t:1;
89 if (t > __wdl_timingInfo[which].maxt) __wdl_timingInfo[which].maxt=t;
90 __wdl_timingInfo[which].cycles += t;
91 __wdl_timingInfo[which].calls += 1;
95 WDL_INT64 _timingQuery(int which, WDL_INT64* cycles)
97 if (__wdl_timingInfo[which].calls && cycles)
99 cycles[0] = __wdl_timingInfo[which].cycles;
100 cycles[1] = __wdl_timingInfo[which].mint;
101 cycles[2] = __wdl_timingInfo[which].maxt;
103 return __wdl_timingInfo[which].calls;
106 #undef TIMING_UNITS
108 #endif