#include #include #include #include static long long get_win32_time(int) { FILETIME ft; GetSystemTimeAsFileTime(&ft); LARGE_INTEGER it = { { ft.dwLowDateTime, ft.dwHighDateTime } }; return it.QuadPart; } static long long get_posix_time(int id) { timespec ts; if (clock_gettime(id, &ts)) return -1; return ts.tv_sec * 1000000000LL + ts.tv_nsec; } static long long get_posix_res(int id) { timespec ts; if (clock_getres(id, &ts)) return -1; return ts.tv_sec * 1000000000LL + ts.tv_nsec; } static long long guess_resolution(long long (*f)(int), int id = -1) { long long r = ~0ULL>>1; for (int i = 0; i < 5; i++) { long long t1 = f(id), t2; do t2 = f(id); while (t2 >= 0 && t2 == t1); if (t2 - t1 < r) r = t2 - t1; } return r; } int main(int argc, char **argv) { printf("SystemTime CLOCK_REALTIME (getres) CLOCK_MONOTONIC (getres)"); long long r1 = -1, r2 = -1, r3 = -1; int cnt = 0; for (;;) { long long r1n = guess_resolution(get_win32_time); long long r2n = guess_resolution(get_posix_time, CLOCK_REALTIME); long long r3n = guess_resolution(get_posix_time, CLOCK_MONOTONIC); if (r1 == r1n && r2 == r2n && llabs(r3-r3n) <= 1) { printf("%s%5d", (cnt ? "\b\b\b\b\b" : ""), cnt); fflush(stdout); sleep(1); cnt++; } else { r1 = r1n; r2 = r2n; r3 = r3n; printf("\n%.7f %.9f (%.9f) %.9f (%.9f)", r1/10000000.0, r2/1000000000.0, get_posix_res(CLOCK_REALTIME) /1000000000.0, r3/1000000000.0, get_posix_res(CLOCK_MONOTONIC)/1000000000.0); fflush(stdout); cnt = 0; } } return 0; }