Time getProcessCPUTime(void) { #if !defined(BE_CONSERVATIVE) && defined(HAVE_CLOCK_GETTIME) && defined (_SC_CPUTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) && defined(HAVE_SYSCONF) static int checked_sysconf = 0; static int sysconf_result = 0; if (!checked_sysconf) { sysconf_result = sysconf(_SC_CPUTIME); checked_sysconf = 1; } if (sysconf_result != -1) { struct timespec ts; int res; res = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); if (res == 0) { return SecondsToTime(ts.tv_sec) + NSToTime(ts.tv_nsec); } } #endif // fallback to getrusage { struct rusage t; getrusage(RUSAGE_SELF, &t); return SecondsToTime(t.ru_utime.tv_sec) + USToTime(t.ru_utime.tv_usec); } }
Time getThreadCPUTime(void) { #if USE_PAPI long long usec; if ((usec = PAPI_get_virt_usec()) < 0) { barf("PAPI_get_virt_usec: %lld", usec); } return USToTime(usec); #elif !defined(BE_CONSERVATIVE) && defined(HAVE_CLOCK_GETTIME) && defined (_SC_THREAD_CPUTIME) && defined(CLOCK_THREAD_CPUTIME_ID) && defined(HAVE_SYSCONF) { static int checked_sysconf = 0; static int sysconf_result = 0; if (!checked_sysconf) { sysconf_result = sysconf(_SC_THREAD_CPUTIME); checked_sysconf = 1; } if (sysconf_result != -1) { // clock_gettime() gives us per-thread CPU time. It isn't // reliable on Linux, but it's the best we have. struct timespec ts; int res; res = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts); if (res == 0) { return SecondsToTime(ts.tv_sec) + NSToTime(ts.tv_nsec); } } } #endif return getProcessCPUTime(); }
static INLINE_ME Time fileTimeToRtsTime(FILETIME ft) { Time t; t = ((Time)ft.dwHighDateTime << 32) | ft.dwLowDateTime; t = NSToTime(t * 100); /* FILETIMES are in units of 100ns */ return t; }
Time getProcessElapsedTime(void) { return NSToTime(getMonotonicNSec()); }