Алгоритм синхронизации: 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 я знаю, что часы имеют очень плохое разрешение, поэтому время будет равным нулю для (относительно) быстрого алгоритма. Но, у которого есть лучшее время разрешения() или часы()? Или это одно и то же?
Ответы
Ответ 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