Почему моя функция на основе c ++ clock () возвращает отрицательное значение? - PullRequest
2 голосов
/ 20 января 2011

Я все еще новичок в C ++, является ли функция часов абсолютной (то есть подсчитывает, сколько времени вы спите) или сколько времени фактически выполняет приложение?

Я хочу надежный способ получения точных интервалов в 1 секунду. Я сохраняю файлы, поэтому мне нужно учитывать это. Я возвращал время выполнения для этого в миллисекундах, а затем спал до конца.

Есть ли более точный или простой способ сделать это?

EDIT: Основная проблема, с которой я столкнулся, заключается в том, что я получаю отрицательное число:

double FCamera::getRuntime(clock_t* end, clock_t* start)
{
    return((double(end - start)/CLOCKS_PER_SEC)*1000);
}


clock_t start = clock();
doWork();
clock_t end = clock();

double runtimeInMilliseconds = getRuntime(&end, &start);

Это дает мне отрицательное число, что с этим?

Walter

Ответы [ 4 ]

3 голосов
/ 20 января 2011

clock() возвращает количество тактов, прошедших с момента запуска программы. Если вы хотите преобразовать значение, возвращаемое часами, в секунды, разделите на CLOCKS_PER_SEC (и умножьте для обратного).

Существует только одна ловушка, начальный момент отсчета, используемый часами в качестве начала выполнения программы, может варьироваться в зависимости от платформы. Чтобы вычислить фактическое время обработки программы, значение, возвращаемое часами, должно сравниваться со значением, возвращаемым при первоначальном обращении к часам.

EDIT

Ларсман был так любезен, чтобы оставлять другие комментарии в комментариях. Я включил их сюда для дальнейшего использования.

  1. В некоторых других реализациях значение, возвращаемое clock(), также включает в себя время всех дочерних элементов, статус которых был получен с помощью wait(2) (или другого вызова типа ожидания). Linux не включает время ожидания детей в значение, возвращаемое clock().

  2. Обратите внимание, что время может меняться. В 32-битной системе, где CLOCKS_PER_SEC равен 1000000 [как указано в POSIX], эта функция будет возвращать одно и то же значение примерно каждые 72 минуты.

EDIT2

После недолгого времяпровождения вот мой переносимый (Linux / Windows) msleep. Однако будьте осторожны, я не имею опыта работы с C / C ++ и, скорее всего, буду содержать самую глупую ошибку за всю историю.

#ifdef _WIN32

#include <windows.h>
#define msleep(ms) Sleep((DWORD) ms)

#else

#include <unistd.h>
inline void msleep(unsigned long ms) {
    while (ms--) usleep(1000);
}

#endif
1 голос
/ 08 января 2015

Вы пропустили * (указатель), Ваш аргумент указатель (адрес переменной clock_t) Итак, Ваш код должен быть изменен ::

return((double(*end - *start)/CLOCKS_PER_SEC)*1000);
0 голосов
/ 20 января 2011

Мой подход основан на:

int gettimeofday(struct timeval *tv, struct timezone *tz);

, который дает количество секунд и микросекунд с начала эпохи. По данным man страниц:

The tv argument is a struct timeval (as specified in <sys/time.h>):

           struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
           };

Итак, поехали:

#include <sys/time.h>

#include <iostream>
#include <iomanip>

static long myclock()
{
    struct timeval tv; 
    gettimeofday(&tv, NULL);
    return (tv.tv_sec * 1000000) + tv.tv_usec;
}

double getRuntime(long* end, long* start)
{
    return (*end - *start);
}

void doWork()
{
    sleep(3);
}

int main(void)
{
    long start = myclock();
    doWork();
    long end = myclock();

    std::cout << "Time elapsed: " << std::setprecision(6) << getRuntime(&end, &start)/1000.0 << " miliseconds" << std::endl;
    std::cout << "Time elapsed: " << std::setprecision(3) << getRuntime(&end, &start)/1000000.0 << " seconds" << std::endl;

    return 0;
}

Выходы:

Time elapsed: 3000.08 miliseconds
Time elapsed: 3 seconds
0 голосов
/ 20 января 2011

Под окнами вы можете использовать:

VOID WINAPI Sleep(
  __in  DWORD dwMilliseconds
);

В Linux вы захотите использовать:

#include <unistd.h>
unsigned int sleep(unsigned int seconds);

Обратите внимание на разницу параметров - миллисекунды в Windows и секунды в Linux.

...