Есть ли способ измерения времени до микросекунд с использованием стандартной библиотеки C? - PullRequest
2 голосов
/ 05 декабря 2010

Существует ли независимый от платформы способ измерения времени до микросекунд с использованием стандартной библиотеки C?

Ответы [ 5 ]

2 голосов
/ 05 декабря 2010

К сожалению, точность измерения зависит от операционной системы.

1 голос
/ 06 декабря 2010

Хотя приведенные выше ответы, безусловно, верны ( c'est la vie ), они не очень полезны.

Я провел некоторое тестирование с Cygwin под Windows XP: на моей машинегранулярность gettimeofday () составляет около 15 мсек (1/64 сек?).Который большой.Также как и гранулярность:

  • clock_t clock (void) (делитель CLOCKS_PER_SEC)
  • clock_t times (struct tms *) (делитель sysconf (_SC_CLK_TCK))

Оба делителя равны 1000 (у POSIX 1000000 для первого?).

Кроме того, clock_getres (CLOCK_REALTIME, ...) возвращает 15 мсек, так что clock_gettime () вряд ли поможет.И CLOCK_MONOTONIC и CLOCK_PROCESS_CPUTIME_ID не работают.

Другими возможными вариантами для CYGWIN могут быть RDTSC;см. статью в Википедии.И, возможно, HPET, но он недоступен в Windows XP.

Также обратите внимание, что в Linux clock () - это время процесса , в то время как в Windows это wall время.

Итак, некоторые примеры кода, как для стандартного Unix, так и для кода CYGWIN, работающего под Windows, что дает гранулярность около 50 микросекунд (на моем компьютере):

#if !CYGWIN
double realElapsedTime(void) {              // returns 0 first time called
    static struct timeval t0;
    struct timeval tv;
    gettimeofday(&tv, 0);
    if (!t0.tv_sec)                         // one time initialization
        t0 = tv;
    return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec) / 1000000.;
}
#else
#include <windows.h>
double realElapsedTime(void) {              // granularity about 50 microsecs
    static LARGE_INTEGER freq, start;
    LARGE_INTEGER count;
    if (!QueryPerformanceCounter(&count))
        assert(0 && "QueryPerformanceCounter");
    if (!freq.QuadPart) {                   // one time initialization
        if (!QueryPerformanceFrequency(&freq))
            assert(0 && "QueryPerformanceFrequency");
        start = count;
    }
    return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart;
}
#endif
1 голос
/ 05 декабря 2010

Функции POSIX gettimeofday и clock_gettime наиболее близки к независимости от платформы. В идеале все платформы следовали бы POSIX, но одна известная печально известная (наряду с различными неясными) - нет.

0 голосов
/ 05 декабря 2010

time () является стандартным практически для всех библиотек времени выполнения C, но имеет разрешение всего 1,0 секунды. В C++ есть функции BOOST ptime microsec_clock::universal_time() и ptime microsec_clock::local_time().

0 голосов
/ 05 декабря 2010

Я бы использовал комбинацию clock () и CLOCKS_PER_SEC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...