评估一段代码的执行时间时候,一般在代码开始和结束位置放一个时间戳,然后两个时间戳相减即可。方法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;
参考: