Подтвердить что ты не робот

Разница во времени в С++

Кто-нибудь знает, как вычислить разницу во времени в С++ в миллисекундах? Я использовал difftime, но у него недостаточно точности для того, что я пытаюсь измерить.

4b9b3361

Ответ 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(), который даст вам что-то многое лучше, чем миллисекунды.