void timer_cputimer_start(uint64 *start_time) { #if defined(WIN32) QueryPerformanceCounter((LARGE_INTEGER*)start_time); #elif defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(CLOCK_PROCESS_CPUTIME_ID) struct timespec tval; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tval); *start_time = tval.tv_sec * 1000 + tval.tv_nsec / 1000000; #elif defined(CLOCKS_PER_SEC) *start_time = (uint64)clock(); #endif } double timer_cputimer_stop(uint64 start_time) { #if defined(WIN32) uint64 end_time, ldFreq; QueryPerformanceCounter((LARGE_INTEGER*)&end_time); QueryPerformanceFrequency((LARGE_INTEGER*)&ldFreq); return ((double)(end_time - start_time) / (double)ldFreq) * 1000.0; #elif defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) && defined(CLOCK_PROCESS_CPUTIME_ID) struct timespec tval; uint64 end_time; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tval); end_time = tval.tv_sec * 1000 + tval.tv_nsec / 1000000; return (double)(end_time - start_time); #elif defined(CLOCKS_PER_SEC) uint64 end_time = (uint64)clock(); return (double)(end_time - start_time)/(double)CLOCKS_PER_SEC; #endif }