эквивалент времени для окон - PullRequest
6 голосов
/ 21 декабря 2011

Я портирую свое приложение на windows с unix и наткнулся на стену.В моем приложении мне нужно найти время в микросекундах (все приложение сильно зависит от него, поскольку оно является высокоточным приложением).

Ранее я использовал структуру timespec, но Windows не содержит такой вещи.Команды GetTickCount недостаточно, поскольку она возвращает время в миллисекундах.Я также думал о QueryPerformanceFrequency.

Может ли кто-нибудь узнать что-то настолько идентичное timespec, насколько это возможно?

В будущем мне может даже потребоваться наносекунда, которую я ничего не искал в windows.

Ответы [ 2 ]

10 голосов
/ 21 декабря 2011

См., Например, Как реализовать долгосрочную синхронизацию с высоким разрешением для окон, используя C ++? и C ++ Функция таймера для предоставления времени в наносекундах .

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

* clock_t clock(void) (divisor CLOCKS_PER_SEC)
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK))

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

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

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

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

Таким образом, некоторые примеры кода, как для стандартного Unix, так и для кода CYGWIN, работающего под Windows, дают гранулярность около 50 микросекунд (на моей машине). Возвращаемое значение указывается в секундах и дает количество секунд, прошедших с момента первого вызова функции. (Я запоздало понял, что это был ответ, который я дал год назад ).

#ifndef __CYGWIN32__
double RealElapsedTime(void) { // returns 0 seconds first time called
   static struct timeval t0;
   struct timeval tv;
   gettimeofday(&tv, 0);
   if (!t0.tv_sec)
      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 on my machine
   static LARGE_INTEGER freq, start;
   LARGE_INTEGER count;
   if (!QueryPerformanceCounter(&count))
      FatalError("QueryPerformanceCounter");
   if (!freq.QuadPart) { // one time initialization
      if (!QueryPerformanceFrequency(&freq))
         FatalError("QueryPerformanceFrequency");
      start = count;
   }
   return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart;
}
#endif
3 голосов
/ 13 октября 2015

Переносим между Windows, UNIX, Linux и чем-то неопределенно современным: std::chrono::high_resolution_clock. Разрешение может отличаться, но вы можете узнать во время компиляции, что это такое. Наносекунды, безусловно, возможны на современном оборудовании.

Имейте в виду, что наносекундная точность действительно означает точность менее метра. Наносекунда при скорости света составляет всего 30 сантиметров. Перемещение вашего компьютера от верхней части стойки к нижней части буквально перемещает его на несколько наносекунд.

...