Как рассчитать разницу во времени в C ++ - PullRequest
81 голосов
/ 08 апреля 2009

Как лучше всего рассчитать разницу во времени в C ++? Я измеряю скорость выполнения программы, поэтому меня интересуют миллисекунды. Еще лучше, секунды. Миллисекунды.

Принятый ответ работает, но должен включать ctime или time.h, как отмечено в комментариях.

Ответы [ 13 ]

4 голосов
/ 08 апреля 2009

Получите системное время в миллисекундах в начале и снова в конце и вычтите.

Чтобы получить количество миллисекунд с 1970 года в POSIX, вы должны написать:

struct timeval tv;

gettimeofday(&tv, NULL);
return ((((unsigned long long)tv.tv_sec) * 1000) +
        (((unsigned long long)tv.tv_usec) / 1000));

Чтобы получить количество миллисекунд с 1601 в Windows, вы должны написать:

SYSTEMTIME systime;
FILETIME filetime;

GetSystemTime(&systime);
if (!SystemTimeToFileTime(&systime, &filetime))
    return 0;

unsigned long long ns_since_1601;
ULARGE_INTEGER* ptr = (ULARGE_INTEGER*)&ns_since_1601;

// copy the result into the ULARGE_INTEGER; this is actually
// copying the result into the ns_since_1601 unsigned long long.
ptr->u.LowPart = filetime.dwLowDateTime;
ptr->u.HighPart = filetime.dwHighDateTime;

// Compute the number of milliseconds since 1601; we have to
// divide by 10,000, since the current value is the number of 100ns
// intervals since 1601, not ms.
return (ns_since_1601 / 10000);

Если вы захотели нормализовать ответ Windows, чтобы он также возвращал количество миллисекунд с 1970 года, вам придется скорректировать свой ответ на 11644473600000 миллисекунд. Но в этом нет необходимости, если все, что вас волнует, это прошедшее время.

2 голосов
/ 10 мая 2014

Если вы используете:

tstart = clock();

// ...do something...

tend = clock();

Тогда вам потребуется следующее, чтобы получить время в секундах:

time = (tend - tstart) / (double) CLOCKS_PER_SEC;
0 голосов
/ 24 сентября 2013

Похоже, что это нормально работает для Intel Mac 10.7:

#include <time.h>

time_t start = time(NULL);


    //Do your work


time_t end = time(NULL);
std::cout<<"Execution Time: "<< (double)(end-start)<<" Seconds"<<std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...