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
}