一个十分简洁的高精度计时器类,可测试代码运行时间

xjh53759299 2010-06-13 07:45:43
#include <stdio.h>
#include <windows.h>
class Timer
{
private:
_LARGE_INTEGER TimeStart;
_LARGE_INTEGER TimeEnd;
public:
Start() {QueryPerformanceCounter(×tart);}//计时开始
End() {QueryPerformanceCounter(&TimeEnd);}//计时结束
double Time();//返回时差
};

double Timer::Time()
{
static double Freq;//计时器频率
static getfreq(0);
if (!getfreq)//获得计时器频率,只运行一次
{
LARGE_INTEGER f;
if (QueryPerformanceFrequency(&f))
Freq=f.QuadPart;
else throw "无法获得定时器频率";
getfreq=1;
}
return (TimeEnd.QuadPart-TimeStart.QuadPart)/Freq;
}
/////////////////////////////////////////////////////////
void main()
{
Timer t;
t.Start();
Sleep(1000);//测试sleep(1000)的精确值
t.End();
printf("%f\n", t.Time());
}
...全文
453 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-06-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mickjoy 的回复:]
为什么编译时提示“”缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int“”
请高手解释一下;
[/Quote]
就是这个static getfreq(0);要加上int,在原始时期,C里面如果函数或者变量不加类型说明,就默认是int类型的,在现代已经不推荐这样了,所以给个warning。
mickjoy 2010-06-15
  • 打赏
  • 举报
回复
为什么编译时提示“”缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int“”
请高手解释一下;
叶卷 2010-06-14
  • 打赏
  • 举报
回复
很好,但用它,还需时间复杂度吗,
2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yzx714 的回复:]
APUE提到了一些Unix下可以做到纳秒级,不知Linux可以不?
[/Quote]
一般 x86 上测真实时间到微秒还是可以的,纳秒估计不会太准……
如果测的是 CPU 时间,估计只能到毫秒了……
yzx714 2010-06-14
  • 打赏
  • 举报
回复
APUE提到了一些Unix下可以做到纳秒级,不知Linux可以不?
cswuyg 2010-06-14
  • 打赏
  • 举报
回复
“windows内部维护了一个高精度的计时器,计时器的精度取决于计算机的硬件速度。”
不是很难,也即是那两个函数。
我也凑凑热闹,发下代码。这代码可以在罗云彬第三版的书的第190页找到主体部分。

;运算公式:(X2-X1)*1000000/Y (微秒)
;2010.6.14
.386
.model flat,stdcall
option casemap:none
;##################################################################
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
;##################################################################
.data
dqTickCounter1 dq ?;时间点1的计数值
dqTickCounter2 dq ?;时间点2的计数值
dqFreq dq ?;计数精度
dqTime dq ?;时间间隔
dwlm dd 1000000;常数
sztip db '计时输出',0
format db 'sleep(1000)计时:%d微秒',0
.data?
buff db 128 dup(?)
;##################################################################

.code
start:
invoke QueryPerformanceCounter,addr dqTickCounter1;时间点1
invoke Sleep,1000
invoke QueryPerformanceCounter,addr dqTickCounter2;时间点2
invoke QueryPerformanceFrequency,addr dqFreq;一秒钟的计数
mov eax,dword ptr dqTickCounter1
mov edx,dword ptr dqTickCounter1 + 4
sub dword ptr dqTickCounter2,eax
sbb dword ptr dqTickCounter2 + 4,edx
finit
fild dqFreq
fild dqTickCounter2
fimul dwlm;乘以1000000
fdivr
fistp dqTime;dqTime中的64位值就是时间间隔(以微秒为单位)
invoke wsprintf,addr buff,addr format,dqTime
invoke MessageBox,NULL,addr buff,addr sztip,MB_OK
invoke ExitProcess,NULL
end start
张赐 2010-06-14
  • 打赏
  • 举报
回复
和网上的一样啊
coolisher 2010-06-14
  • 打赏
  • 举报
回复
不错,精度蛮高的
jokey514 2010-06-14
  • 打赏
  • 举报
回复
看看 ~~~
Longerandlonger 2010-06-14
  • 打赏
  • 举报
回复
我来美化一下代码,用code::blocks

/****
测试代码运行时间
*/
#include <stdio.h>
#include <windows.h>
class Timer
{
private:
_LARGE_INTEGER TimeStart;
_LARGE_INTEGER TimeEnd;
public:
Start() {
QueryPerformanceCounter(×tart); //计时开始
}
End() {
QueryPerformanceCounter(&TimeEnd); //计时结束
}
double Time(); //返回时差
};

double Timer::Time()
{
static double Freq;//计时器频率
static getfreq(0);
if (!getfreq) { //获得计时器频率,只运行一次
LARGE_INTEGER f;
if (QueryPerformanceFrequency(&f))
Freq=f.QuadPart;
else throw "无法获得定时器频率";
getfreq=1;
}
return (TimeEnd.QuadPart-TimeStart.QuadPart)/Freq;
}
/////////////////////////////////////////////////////////
void main()
{
Timer t;
t.Start();
Sleep(1000);//测试sleep(1000)的精确值
t.End();
printf("%f\n", t.Time());
}

zbbanya 2010-06-14
  • 打赏
  • 举报
回复
学习了…………
blank1 2010-06-14
  • 打赏
  • 举报
回复
支持啊
wangxipu 2010-06-14
  • 打赏
  • 举报
回复
网上到处都是这段代码

没什么值得夸的
独酌逸醉 2010-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhangci226 的回复:]
和网上的一样啊
[/Quote]

呵呵。
AAA20090987 2010-06-14
  • 打赏
  • 举报
回复
支持LZ开源,呵呵。
liutengfeigo 2010-06-14
  • 打赏
  • 举报
回复
do_fork 2010-06-14
  • 打赏
  • 举报
回复
不管你是Linux还是windows还是UNIX,也就是个毫秒级精度。
赶上系统高负载的时候,对不起,毫秒级精度都不能保证。
tan625747 2010-06-13
  • 打赏
  • 举报
回复
你自己写的

好东西,精确值还高的

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧