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