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

Алгоритм синхронизации: clock() vs time() в С++

Для синхронизации алгоритма (приблизительно в мс), какой из этих двух подходов лучше:

clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

Или,

time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

Кроме того, из некоторых обсуждений на канале С++ в Freenode я знаю, что часы имеют очень плохое разрешение, поэтому время будет равным нулю для (относительно) быстрого алгоритма. Но, у которого есть лучшее время разрешения() или часы()? Или это одно и то же?

4b9b3361

Ответ 1

Это зависит от того, что вы хотите: time измеряет реальное время, а clock измеряет время обработки текущего процесса. Если ваш процесс засыпает сколько-нибудь заметное время, или система занята другими процессами, они будут очень разными.

http://en.cppreference.com/w/cpp/chrono/c/clock

Ответ 2

<chrono> будет лучшей библиотекой, если вы используете С++ 11.

#include <iostream>
#include <chrono>
#include <thread>

void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    f();
    auto t2 = std::chrono::high_resolution_clock::now();
    std::cout << "f() took "
              << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
              << " milliseconds\n";
}

Пример, взятый из здесь.

Ответ 3

Структура time_t, вероятно, будет целым числом, что означает, что она будет иметь разрешение секунды.

Первый фрагмент кода: он будет считать только время, когда процессор что-то делал, поэтому, когда вы спите(), он ничего не будет считать. Его можно обойти, посчитав время сна(), но через некоторое время он, вероятно, начнет дрейфовать.

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

Для показания времени с наилучшим разрешением вы можете получить что-то вроде этого:

double getUnixTime(void)
{
    struct timespec tv;

    if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;

    return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}

double start_time = getUnixTime();
double stop_time, difference;

doYourStuff();

stop_time = getUnixTime();
difference = stop_time - start_time;

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

Ответ 4

<chrono> является лучшим. Visual Studio 2013 предоставляет эту функцию. Лично я пробовал все методы, упомянутые выше. Я настоятельно рекомендую вам использовать библиотеку <chrono>. Он может отслеживать время стены и в то же время иметь хорошее разрешение (гораздо меньше секунды).

Ответ 5

Как насчет gettimeofday? Когда он называется, он обновляет две структуры с информацией о времени. Обычно левой структуры достаточно, что будет нести время со времен Эпохи, 01-01-1970 00:00:00 (UTC). Его можно использовать следующим образом:

#include <time.h>

struct timeval start;
double mtime, seconds, useconds;
gettimeofday(&start, NULL); //left hand struct is usually enough
seconds  = start.tv_sec; //time in seconds
useconds = start.tv_usec; //time in microseconds