Измерение времени в миллисекундах или микросекундах для Windows C ++

Как вы измеряете время выполнения в миллисекундах или микросекундах в Windows C ++?

Я нашел много методов с одним временем вызова (NULL), но он измеряет время только в секундах, а секунды clock () (clock_t) измеряют время процессора, а не фактическое время.

Я нашел функцию gettimeofday (Календарное время), упомянутую в этой статье: dropbox.com/s/k0zv8pck7ydbakz/1_7-PDF_thesis_2.pdf

Эта функция предназначена для Linux (время вычисления в милли и микросекундах), а не для Windows.

Я нашел ему альтернативу для Windows: dropbox.com/s/ofo99b166l7e2gf/gettimeofday.txt

И это может быть актуально: stackoverflow.com/questions/1861294/how-to-calculate-execution-time-of-a-code-snippet-in-c


person user3617694    schedule 12.05.2014    source источник
comment
Вы используете C ++ с поддержкой CLR? Или Win32? В этом вопросе отсутствует общее понимание вопроса.   -  person Evan L    schedule 12.05.2014
comment
Я думаю, что этот вопрос задают некорректно, но его можно исправить. +1 в интересах справедливости, а может кто-нибудь помочь отредактировать это?   -  person Aaron Hall    schedule 13.05.2014


Ответы (3)


Вы можете использовать стандартную <chrono> библиотеку C ++:

#include <iostream>
#include <chrono>

// long operation to time
long long fib(long long n) {
  if (n < 2) {
    return n;
  } else {
    return fib(n-1) + fib(n-2);
  }
}

int main() {
  auto start_time = std::chrono::high_resolution_clock::now();

  long long input = 32;
  long long result = fib(input);

  auto end_time = std::chrono::high_resolution_clock::now();
  auto time = end_time - start_time;

  std::cout << "result = " << result << '\n';
  std::cout << "fib(" << input << ") took " <<
    time/std::chrono::milliseconds(1) << "ms to run.\n";
}

Следует иметь в виду, что использование <chrono> обеспечивает типобезопасный общий код синхронизации, но чтобы получить это преимущество, вы должны использовать его немного иначе, чем вы использовали бы глупые библиотеки времени, небезопасные по типу, которые хранят длительность и временные точки в типах, таких как int . Вот ответ, который объясняет некоторые конкретные сценарии использования и различия между использованием нетипизированных библиотек и передовыми методами использования chrono: https://stackoverflow.com/a/15839862/365496


Разработчик реализации стандартной библиотеки Visual Studio указал, что низкое разрешение high_resolution_clock было исправлено в VS2015 с помощью QueryPerformanceCounter().

person bames53    schedule 12.05.2014
comment
Обратите внимание! В некоторых версиях заголовка chrono, поставляемого с Visual Studio, есть ошибка. См. здесь. QueryPerformanceCounter - это способ добиться высокого разрешения синхронизации в Win32. - person Rook; 12.05.2014
comment
Я могу подтвердить, что VS 2015 теперь использует QueryPerformanceCounter вместо high_resolution_clock. (В более старых версиях VS использовалось просто GetSystemTime для всех часов.) - person Paul Groke; 16.08.2015
comment
В операторе возврата в fib () отсутствует точка с запятой - person Chief A; 28.12.2018

Вам нужно использовать API QPC / QPF, чтобы вычислить время выполнения. Вызов необходимого кода между вызовами QueryPerformanceCounter, а затем используйте QueryPerformanceFrequency, чтобы преобразовать циклы в микросекунды.

LARGE_INTEGER nStartTime;
LARGE_INTEGER nStopTime;
LARGE_INTEGER nElapsed;
LARGE_INTEGER nFrequency;

::QueryPerformanceFrequency(&nFrequency); 
::QueryPerformanceCounter(&nStartTime);

    SomethingToBeTimed();

::QueryPerformanceCounter(&nStopTime);
nElapsed.QuadPart = (nStopTime.QuadPart - nStartTime.QuadPart) * 1000000;
nElapsed.QuadPart /= nFrequency.QuadPart;

Ссылки: http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408%28v=vs.85%29.aspx.

person Darrin Cullop    schedule 12.05.2014