every blog every motto: Big mouthfuls ofter choke
前言
关于c/c++ 计时小结。
1 秒(s) = 1000毫秒(ms)=1000000微妙(us)
正文
1. 毫秒(ms)级计时
#include<time.h> // 所需要的头文件
double duration // 程序运行时间
time_t start = clock(); // 计时开始
... // 所需要记录的时间的程序
time_t end = clock(); // 结束计时
duration = end-start;
print("程序运行了:%f s",duration);
2. 微秒(us)级计时
#include<windows.h>
#include<stdio.h>
// 初始化计时
int ms = 1000; // 毫秒
int us = 1000000; // 微秒
LARGE_INTEGR nFreq; // 时钟频率
LARGE_INTEGR t1,t2;
double duration; // 程序运行时间
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&t1); // 开始计时
.... // 所需要记录时间的代码
QueryPerformanceCounter(&t2); // 结束计时
// 程序运行时间
duration = (t2.QuadPart-t1.QuadPart)/(double)nFreq.QuadPart;
//输出显示
cout <<"花费了:"<<duration*us<<"us"<<endl;
注:
- duration1000 输出的是毫秒;duration1000000输出的微妙。
- 初始化计时程序要放在主程序中,不然容易报错(笔者在花费了很长时间)
3.另一种微秒级实现
#include<chrono>
using namespace std;
using namespace chrono;
// 开始计时
auto start = system_clock::now();
... // 所需记录时间的代码
// 结束计时
auto end = system_clock::now();
// 程序运行的时间
auto duration = duration_cast<microseconds>(end-start)
// 输出显示
cout <<"花费了:"
<<double(duration.count())*micoseconds::period::num/micosconds::period::den<<"秒"<<endl;
注:
- 文献[3]指出上述第二种方法与CPU的频率稳定性有关,在计时时间较常的情况下,上述计时方法会出现计时不稳定的结果。(笔者未加验证)
- 第三种方法,刚开始调试,由于精度不满足需求,直接跳过。整理文章时发现其也可以输出微秒级,如有需要可参考文献[3]。
- 更多的计时方法,请查阅参考文献。
参考文献:
[1] http://www.cppblog.com/deane/articles/113151.html
[2] https://blog.csdn.net/zhouxianen1987/article/details/53883684
[3] https://blog.csdn.net/qq_26341675/article/details/70194851
[4] https://blog.csdn.net/homewm/article/details/80302534
[5] https://blog.csdn.net/lizehao1973/article/details/85456872