12 #include "wdlcstring.h"
14 #if defined(__APPLE__) && defined(__OBJC__)
15 #import <Foundation/Foundation.h>
20 WDL_INT64 cycles
,mint
,maxt
;
22 } __wdl_timingInfo
[64];
23 static int __wdl_timingInfo_reg
;
26 static void __wdl_timingInfo_gettime(WDL_INT64
*t
)
29 #define TIMING_UNITS "QPC_UNITS"
31 QueryPerformanceCounter(&now
);
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
;
39 #define TIMING_UNITS "cycles"
51 void _timingPrint(void)
54 for (x
= 0; x
< (int) (sizeof(__wdl_timingInfo
)/sizeof(__wdl_timingInfo
[0])); x
++)
56 if (__wdl_timingInfo
[x
].calls
)
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;
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])))
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
;