Алгоритм синхронизации: 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
измеряет время обработки, затраченное текущим процессом. Если ваш процесс спит какое-то заметное количество времени или система занята другими процессами, они будут очень разными.
<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