Кто-нибудь знает, как вычислить разницу во времени в С++ в миллисекундах?
Я использовал difftime
, но у него недостаточно точности для того, что я пытаюсь измерить.
Разница во времени в С++
Ответ 1
Вы должны использовать одну из более специфических структур времени: timeval (microsecond-resolution) или timespec (наносекундное разрешение), но вы можете сделать это вручную довольно легко:
#include <time.h>
int diff_ms(timeval t1, timeval t2)
{
return (((t1.tv_sec - t2.tv_sec) * 1000000) +
(t1.tv_usec - t2.tv_usec))/1000;
}
Это, очевидно, имеет некоторые проблемы с переполнением целых чисел, если разница во времени действительно велика (или если у вас есть 16-битные int), но это, вероятно, не обычный случай.
Ответ 2
Я знаю, что это старый вопрос, но есть обновленный ответ для С++ 0x. Существует новый заголовок <chrono>
, который содержит современные утилиты времени. Пример использования:
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::milliseconds milliseconds;
Clock::time_point t0 = Clock::now();
std::this_thread::sleep_for(milliseconds(50));
Clock::time_point t1 = Clock::now();
milliseconds ms = std::chrono::duration_cast<milliseconds>(t1 - t0);
std::cout << ms.count() << "ms\n";
}
50ms
Более подробную информацию можно найти здесь:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm
В настоящее время также существует поддержка boost <chrono>
.
Ответ 3
Если вы используете win32, FILETIME является наиболее точным, что вы можете получить: Содержит 64-битное значение, представляющее число 100-наносекундных интервалов с 1 января 1601 года (UTC).
Итак, если вы хотите рассчитать разницу между двумя раз в миллисекундах, вы делаете следующее:
UINT64 getTime()
{
SYSTEMTIME st;
GetSystemTime(&st);
FILETIME ft;
SystemTimeToFileTime(&st, &ft); // converts to file time format
ULARGE_INTEGER ui;
ui.LowPart=ft.dwLowDateTime;
ui.HighPart=ft.dwHighDateTime;
return ui.QuadPart;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
//! Start counting time
UINT64 start, finish;
start=getTime();
//do something...
//! Stop counting elapsed time
finish = getTime();
//now you can calculate the difference any way that you want
//in seconds:
_tprintf(_T("Time elapsed executing this code: %.03f seconds."), (((float)(finish-start))/((float)10000))/1000 );
//or in miliseconds
_tprintf(_T("Time elapsed executing this code: %I64d seconds."), (finish-start)/10000 );
}
Ответ 4
Функция часов дает вам миллисекундный таймер, но это не самый большой. Его реальное разрешение будет зависеть от вашей системы. Вы можете попробовать
#include <time.h>
int clo = clock();
//do stuff
cout << (clock() - clo) << endl;
и посмотрите, как ваши результаты.
Ответ 5
Вы можете использовать gettimeofday
, чтобы получить количество микросекунд с эпохи. Секундный сегмент значения, возвращаемого gettimeofday(), такой же, как и возвращаемый функцией time(), и может быть отнесен к time_t и использован в difftime. Миллисекунда составляет 1000 микросекунд.
После использования difftime, вычислите разницу в поле микросекунды самостоятельно.
Ответ 6
Вы можете получить микро и наносекундную точность из Boost.Date_Time.
Ответ 7
Если вы хотите провести бенчмаркинг, вы можете увидеть некоторые из других потоков здесь, на SO, которые обсуждают тему.
Кроме того, убедитесь, что вы понимаете разницу между точностью и точностью.
Ответ 8
Я думаю, вам придется использовать что-то специфичное для платформы. Надеюсь, это не имеет значения? например. В Windows просмотрите QueryPerformanceCounter(), который даст вам что-то многое лучше, чем миллисекунды.