我正在编写一个程序,并尝试计算给定代码块运行时经过的秒数。之后我想打印在几秒钟内运行代码块所花费的总时间。我写的是:
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小数精度的任何时间。
答案 0 :(得分:6)
您可以使用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;
}
答案 1 :(得分:5)
time
的返回值是整数秒。投射到double
不会带回丢失的小数秒。
您需要更精确的时钟功能,例如gettimeofday
(如果您需要挂钟时间)或times
(如果您需要CPU时间)。
在Windows上,有timeGetTime
,QueryPerformanceCounter
(Castiblanco演示)或GetSystemTimeAsFileTime
。
C ++终于得到了一些带有C ++ 11 <chrono>
标题的标准高分辨率时钟函数,由Chris在评论中提出。
答案 2 :(得分:2)
实际上我更喜欢用毫秒来做,因为如果你只使用几秒就有大量的函数可以返回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;
}
答案 3 :(得分:1)
您可以使用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();
}
答案 4 :(得分:0)
这样的事情应该有效:
#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);
}