Измерение времени с разрешением микросекунд в C++?

Я ищу способ измерения микросек в C++/Windows.

Я читал о функции "часы", но она возвращает только миллисекунды...
Есть ли способ сделать это?

5 ответов

Решение

Используйте QueryPerformanceCounter и QueryPerformanceFrequency для наилучшей синхронизации зерна в Windows.

Статья MSDN о синхронизации кода с этими API здесь (пример кода на VB - извините).

В Windows доступно два высокоточных (с разрешением 100 нс) такта:

  • GetSystemTimePreciseAsFileTime: Разрешение 100 нс, синхронизировано с UTC
  • QueryPerformanceCounter: Разрешение 100 нс, не синхронизировано с UTC

QueryPerformanceCounter не зависит и не синхронизируется с каким-либо внешним указателем времени. Это полезно для измерения абсолютных временных интервалов.

GetSystemTimePreciseAsFileTime синхронизируется. Если ваш компьютер ускоряется или замедляется, ваши часы, чтобы постепенно синхронизировать его с сервером времени, GetSystemTimePreciseAsFileTime, соответственно, будут медленнее или быстрее, чем абсолютные временные промежутки.

Руководство является:

  • если вам нужны синхронизированные UTC временные метки, например, для использования в нескольких системах: используйте GetSystemTimePreciseAsFileTime
  • если вам нужны только абсолютные промежутки времени: используйте QueryPerformanceCounter

Бонус Чтение

Вся инфраструктура трассировки на уровне ядра в Windows использует QueryPerformanceCounter для измерения абсолютных временных интервалов.

GetSystemTimeAsFileTime был бы полезен для чего-то вроде регистрации.

Я думаю, нет ничего плохого в ответе на QuerPerformance*, который уже дан: вопрос был для решения, специфичного для Windows, и вот оно. Я полагаю, что для кроссплатформенного решения C++ boost::chrono имеет смысл. Реализация Windows использует методы QuerPerformance*, и вы сразу же получите решение для Linux и Mac.

http://www.boost.org/doc/libs/1_45_0/doc/html/date_time/posix_time.html

Altough

Получите время UTC, используя часы с разрешением менее секунды. В системах Unix это реализовано с использованием GetTimeOfDay. На большинстве платформ Win32 это реализовано с использованием ftime. Системы Win32 часто не достигают микросекундного разрешения через этот API. Если более высокое разрешение критично для вашего приложения, протестируйте свою платформу, чтобы увидеть достигнутое разрешение.

Более поздние реализации могут предоставлять метки времени с микросекундным разрешением для окон с высокой точностью. Совместное использование системного времени файлов и счетчика производительности позволяет с такой точностью увидеть этот поток или также этот

Одна из недавних реализаций может быть найдена в проекте отметки времени Windows

(поскольку никто еще не упомянул чистый подход на C++),

с С ++11:

#include <chrono>
std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch())

дает вам количество микросекунд с 1970-01-01, а также порт php microtime(true) api будет

#include <chrono>
double microtime(){
    return (double(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count()) / double(1000000));
}

дает вам количество секунд с 1970-01-01 с точностью до микросекунды

Другие вопросы по тегам