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

31
задан Veger 17 December 2014 в 12:50
поделиться

7 ответов

Необходимо использовать одну из более определенных временных структур, или timeval (разрешение микросекунды) или 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-разрядный ints), но это - вероятно, не общий падеж.

19
ответ дан 27 November 2019 в 21:27
поделиться

если Вы используете 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 );
}
7
ответ дан 27 November 2019 в 21:27
поделиться

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

#include <time.h>

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

и видеть, как результаты.

5
ответ дан 27 November 2019 в 21:27
поделиться

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

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

2
ответ дан 27 November 2019 в 21:27
поделиться

Можно стать микро и точность наносекунды из Повышение. Date_Time.

2
ответ дан 27 November 2019 в 21:27
поделиться

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

0
ответ дан 27 November 2019 в 21:27
поделиться

Если Вы надеетесь делать сравнительное тестирование, Вы могли бы хотеть видеть часть из другой потоки здесь на ПОЭТОМУ, которые обсуждают тему.

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

1
ответ дан 27 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

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