Я пишу программу и пытаюсь рассчитать количество секунд, которое проходит, когда выполняется данный блок кода. После этого я хотел бы напечатать общее время, необходимое для выполнения блока кода в секундах. Я написал следующее:
time_t start = time(0);
// block of code
double seconds_since_start = difftime(time(0), start);
printf("seconds since start: %2.60f\n", seconds_since_start);
я имею printf()
печать с точностью до 60 десятичных знаков, и все еще получается 0,000000 …
Есть ли ошибка в моей функции времени? Мне трудно поверить, что задание, которое я прошу ко времени, не будет учитывать время с точностью до 60 десятичных знаков.
Вы можете использовать утилиты даты и времени, доступные в C ++ 11:
#include <chrono>
#include <iostream>
#include <thread>
int main()
{
auto start = std::chrono::high_resolution_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(5));
auto end = std::chrono::high_resolution_clock::now();
auto difference = std::chrono::duration_cast<std::chrono::seconds>(end - start).count();
std::cout << "Seconds since start: " << difference;
}
Возвращаемое значение из time
является целым числом секунд. Приведение к double
не вернет потерянные доли.
Вам нужна более точная функция часов, такая как gettimeofday
(если вы хотите настенные часы) или times
(если вы хотите процессорное время).
В Windows есть timeGetTime
, QueryPerformanceCounter
(что демонстрирует Кастибланко), или GetSystemTimeAsFileTime
.
C ++ наконец получил некоторые стандартные функции часов высокого разрешения с C ++ 11 <chrono>
заголовок, предложенный Крисом в комментариях.
На самом деле я предпочитаю делать это с миллисекундами, потому что есть тонны функций, которые могут возвращать 0, если вы используете только секунды, по этой причине лучше использовать миллисекунды.
#include <time.h>
double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
}int main()
{
LARGE_INTEGER t_inicio, t_final;
double sec;
QueryPerformanceCounter(&t_inicio);
// code here, the code that you need to knos the time.
QueryPerformanceCounter(&t_final);
sec = performancecounter_diff(&t_final, &t_inicio);
printf("%.16g millisegudos\n", sec * 1000.0);*/
}
return 0;
}
ты можешь использовать boost::timer
template<typename T>
double sortTime(std::vector<T>& v, typename sort_struct<T>::func_sort f){
boost::timer t; // start timing
f(v);
return t.elapsed();
}
Нечто подобное должно работать:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
clock_t begin, end;
double time_spent;
begin = clock();
//Do stuff
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("%Lf\n",time_spent);
}