C++的几种计时函数示例

评估一段代码的执行时间时候,一般在代码开始和结束位置放一个时间戳,然后两个时间戳相减即可。方法1和方法2的时间是一致的,方法3在linux上有时候不准。

时间单位缩写对应:s(秒),ms(毫秒), μs(微秒),ns(纳秒)。1s=1000ms=1000 000μs=1000 000 000ns。

精度情况:

  • clock() : ms
  • system_clock::now() : ns
  • gettimeofday(time_val*, NULL) : us

示例代码的单位都是毫秒,可根据需求自行换算。

//方法1,标准库
#include <sys/time.h>

struct timeval tv;
gettimeofday(&tv,NULL);
auto b1=(unsigned long long)tv.tv_sec*1000+(unsigned long long)tv.tv_usec/1000;
sleep(1);
gettimeofday(&tv,NULL);
auto b2=(unsigned long long)tv.tv_sec*1000+(unsigned long long)tv.tv_usec/1000;
cout<<"method 1, cost time is:"<<(b2-b1)<<endl;


//方法2,chrono
#include<chrono>
using namespace std::chrono; 
auto t1= duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
sleep(1);
auto t2=duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
cout<<"method 2, cost time is:"<<(t2-t1)<<endl;

//方法2副本,该代码只能求两段时间差,不能得到打印出当前时刻。
auto begin=system_clock::now();
sleep(1);
auto end=system_clock::now();
cout<<"method 2-1, cost time is:"<<duration_cast<milliseconds>(end - begin).count()<<endl;



//方法3
#include <unistd.h>
clock_t c1=clock();
sleep(1);
clock_t c2=clock();
cout<<"method 3, cost time is:"<<(c2-c1)<<endl;

chrono时钟方法的拓展

chrono库主要包含了三种类型:时间间隔Duration、时钟Clocks和时间点Time point。

chrono方法获得时间点主要是通过clock时钟获得的。一共有三个时钟如下:

  • system_clock::now()                -> 从系统获取的时钟;
  • steady_clock::now()                 -> 不能被修改的时钟;
  • high_resolution_clock::now()   -> 高精度时钟,实际上是system_clock或者steady_clock的别名。
cout << std::chrono::duration_cast<std::chrono::microseconds>( t2-t1 ).count() <<” microseconds”<< endl;
输出:
20 microseconds

 时钟间隔Duration的换算chrono提供了如下模板,默认纳秒。

  • duration_cast<chrono::nanoseconds>          纳秒
  • duration_cast<chrono::milliseconds>            毫秒
  • duration_cast<chrono::microseconds>         微秒
  • duration_cast<chrono::seconds>                  秒
  • duration_cast<chrono::minutes>                  分钟
  • duration_cast<chrono::hours>                     小时

time_point表示一个时间点,用来获取1970.1.1以来的秒数和当前的时间。time_point必须要clock来计时,time_point有一个函数time_since_epoch()用来获得1970年1月1日到time_point时间经过的duration。下面的例子计算当前时间距离1970年1月一日有多少小时:

cout<< duration_cast<chrono::hours>(system_clock::now().time_since_epoch()).count()<<endl;

参考:

https://www.cnblogs.com/qicosmos/p/3642712.html

猜你喜欢

转载自blog.csdn.net/u010420283/article/details/111946293