Разница во времени в C ++ - PullRequest
       12

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

31 голосов
/ 21 ноября 2008

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

Ответы [ 8 ]

71 голосов
/ 12 февраля 2011

Я знаю, что это старый вопрос, но есть обновленный ответ для C ++ 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 / ОТК1 / SC22 / wg21 / документы / документы / 2008 / n2661.htm

Существует также расширенная реализация <chrono>.

19 голосов
/ 21 ноября 2008

Вы должны использовать одну из более конкретных временных структур: временную (микросекундное разрешение) или временную (наносекундное разрешение), но вы можете сделать это довольно легко вручную:

#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-битные числа), но это, вероятно, не распространенный случай.

7 голосов
/ 23 января 2009

, если вы используете 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 );
}
5 голосов
/ 21 ноября 2008

Функция часов дает вам миллисекундный таймер, но он не самый лучший. Его реальное разрешение будет зависеть от вашей системы. Вы можете попробовать

#include <time.h>

int clo = clock();
//do stuff
cout << (clock() - clo) << endl;

и посмотрите, как ваши результаты.

2 голосов
/ 21 ноября 2008

Вы можете получить микро- и наносекундную точность из Boost.Date_Time .

2 голосов
/ 21 ноября 2008

Вы можете использовать gettimeofday, чтобы получить количество микросекунд с начала эпохи. Сегмент секунд значения, возвращаемого gettimeofday (), совпадает с сегментом, возвращаемым функцией time (), и может быть приведен к time_t и использован в difftime Миллисекунда - 1000 микросекунд.

После использования difftime рассчитайте разницу в поле микросекунд самостоятельно.

1 голос
/ 21 ноября 2008

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

Также убедитесь, что вы понимаете разницу между точностью и точностью.

0 голосов
/ 21 ноября 2008

Я думаю, вам придется использовать что-то для конкретной платформы. Надеюсь, это не имеет значения? например. В Windows посмотрите на QueryPerformanceCounter(), который даст вам много чего лучше, чем миллисекунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...