C++ получает миллисекунды начиная с некоторой даты

Мне нужен некоторый путь в C++ для отслеживания количество миллисекунд начиная с выполнения программы. И мне нужна точность, чтобы быть в миллисекундах. (В моем поиске с помощью Google я нашел много людей, которые сказали, чтобы включать time.h и затем умножить вывод time() 1 000... это не будет работать.)

9
задан JnBrymn 19 July 2010 в 18:16
поделиться

8 ответов

1
ответ дан 4 December 2019 в 15:11
поделиться

clock предлагалось несколько раз. Здесь есть две проблемы. Во-первых, у него часто нет разрешения даже близко к миллисекунде (10-20 мс, вероятно, более распространено). Во-вторых, некоторые его реализации (например, Unix и подобные) возвращают время процессора, а другие (например, Windows) возвращают время стены.

Вы на самом деле не сказали, хотите ли вы время на стене или процессорное время, поэтому сложно дать действительно хороший ответ. В Windows вы можете использовать GetProcessTimes . Это даст вам напрямую процессорное время ядра и пользователя. Он также сообщит вам, когда был создан процесс, поэтому, если вы хотите, чтобы время в миллисекундах прошло с момента создания процесса, вы можете вычесть время создания процесса из текущего времени ( GetSystemTime ). Также упоминался QueryPerformanceCounter . У этого есть несколько собственных странностей - например, в некоторых реализациях он извлекает время из счетчика циклов ЦП, поэтому его частота меняется при / при изменении скорости ЦП. Другие реализации считывают данные с таймера материнской платы на 1,024 МГц, который не зависит от скорости процессора (и условия, при которых каждый из них используется, не совсем очевидны).

В Unix вы можете использовать GetTimeOfDay , чтобы просто получить время стены с (по крайней мере, с возможностью) относительно высокой точностью.Если вам нужно время для процесса, вы можете использовать раз или getrusage (последний новее и дает более полную информацию, которая также может быть более точной).

Итог: как я сказал в своем комментарии, нет никакого способа получить то, что вы хотите, портативно. Поскольку вы не сказали, хотите ли вы время процессора или время стены, даже для конкретной системы, нет однозначного ответа. Тот, который вы "приняли" ( clock () ), имеет то достоинство, что доступен практически в любой системе, но то, что он возвращает, также варьируется в самых широких пределах.

8
ответ дан 4 December 2019 в 15:11
поделиться

Это не специфично для C ++ (и не переносимо), но вы можете:

SYSTEMTIME systemDT;

В Windows.

Отсюда вы можете получить доступ к каждому члену systemDT struct .

Вы можете записать время запуска программы и сравнить текущее время с записанным (например, systemDT по сравнению с systemDTtemp ).

Чтобы обновить, вы можете вызвать GetLocalTime (& systemDT);

Для доступа к каждому члену вы должны сделать systemDT.wHour , systemDT.wMinute , ] systemDT.wMilliseconds .

Чтобы получить дополнительную информацию о СИСТЕМНОЕ ВРЕМЯ .

0
ответ дан 4 December 2019 в 15:11
поделиться

Включите time.h, а затем используйте функцию clock (). Он возвращает количество тактов часов, прошедших с момента запуска программы. Просто разделите его на «CLOCKS_PER_SEC», чтобы получить количество секунд, затем вы можете умножить его на 1000, чтобы получить количество миллисекунд.

1
ответ дан 4 December 2019 в 15:11
поделиться

Некоторое кроссплатформенное решение. Этот код использовался для некоторого тестирования:

#ifdef WIN32
  LARGE_INTEGER g_llFrequency = {0};
  BOOL g_bQueryResult = QueryPerformanceFrequency(&g_llFrequency);
#endif

//...

long long osQueryPerfomance()
{
#ifdef WIN32
  LARGE_INTEGER llPerf = {0};
  QueryPerformanceCounter(&llPerf);
  return llPerf.QuadPart * 1000ll / ( g_llFrequency.QuadPart / 1000ll);
#else
  struct timeval stTimeVal;
  gettimeofday(&stTimeVal, NULL);
  return stTimeVal.tv_sec * 1000000ll + stTimeVal.tv_usec;
#endif
}
1
ответ дан 4 December 2019 в 15:11
поделиться

Наиболее переносимым способом является использование функции clock . Обычно она сообщает время, в течение которого ваша программа использовала процессор, или его приблизительное значение. Однако обратите внимание на следующее:

  • Разрешение не очень хорошее для систем GNU. Какая жалость.

  • Позаботьтесь о преобразовании всего в double , прежде чем выполнять деления и назначения.

  • Счетчик хранится как 32-битное число в 32-битном GNU, что может сильно раздражать долго выполняющиеся программы.

Существуют альтернативы, использующие «настенное время», которые дают лучшее разрешение, как в Windows, так и в Linux. Но как сказано в руководстве libc: Если вы пытаетесь оптимизировать свою программу или измерить ее эффективность, очень полезно знать, сколько процессорного времени она использует. Для этого календарное время и прошедшее время бесполезны, потому что процесс может тратить время на ожидание ввода-вывода или на то, чтобы другие процессы использовали ЦП.

1
ответ дан 4 December 2019 в 15:11
поделиться

Хотите, чтобы время на настенных часах, время процессора или другие измерения? Кроме того, что это за платформа? Не существует универсального переносимого способа получения большей точности, чем time () и clock () , но ...

  • в большинстве систем Unix вы можете использовать ] gettimeofday () и / или clock_gettime () , которые обеспечивают точность не менее микросекунд и доступ к множеству таймеров;
  • Я не так хорошо знаком с Windows, но с одним из эти функции , вероятно, делают то, что вы хотите.
0
ответ дан 4 December 2019 в 15:11
поделиться

Вот решение на C++0x и пример того, почему clock() может делать не то, что вы думаете.

#include <chrono>
#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
   auto start1 = std::chrono::monotonic_clock::now();
   auto start2 = std::clock();

   sleep(1);

   for( int i=0; i<100000000; ++i);

   auto end1 = std::chrono::monotonic_clock::now();
   auto end2 = std::clock();

   auto delta1 = end1-start1;
   auto delta2 = end2-start2;

   std::cout << "chrono: " << std::chrono::duration_cast<std::chrono::duration<float>>(delta1).count() << std::endl;

   std::cout << "clock: " << static_cast<float>(delta2)/CLOCKS_PER_SEC << std::endl;
}

На моей системе это выводит:

chrono: 1.36839
clock: 0.36

Вы заметите, что в методе clock() не хватает секунды. Проницательный наблюдатель также может заметить, что clock(), похоже, имеет меньшее разрешение. На моей системе он тикает с шагом 12 миллисекунд, ужасное разрешение.

Если вы не можете или не хотите использовать C++0x, посмотрите на Boost.DateTime от ptime microsec_clock::universal_time().

1
ответ дан 4 December 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: