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

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

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;

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

5 ответов


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

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


<chrono> будет лучшей библиотекой, если вы используете C++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";
}

пример взят из здесь.


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

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

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

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

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;

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


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


Как насчет 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