高精度计时器,计算代码执行时间类下载
下午闲着无聊,写了一个类,用于统计代码执行时间。本类采用高精度计时器实现,主要有两个函数。
1.QueryPerformanceFrequency该函数MSDN的解释是:The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.我的理解是统计出一秒内CPU的执行频率。
2.QueryPerformanceCounter该函数MSDN的解释是:The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter.我的理解是当前CPU执行的次数。
因此我的这段代码的主要思路是:在要统计的代码块之前,用QueryPerformanceCounter一次记一个counter,在代码使用之后再使用一次QueryPerformanceCounter得到另一个counter,两者相减除以一个QueryPerformanceFrequency就是执行所需要的秒数。
但是如果遇上一个骨灰级的机器加人品又不好,不支QueryPerformanceFrequency和QueryPerformanceCounter怎么搞呢?我在代码中使用了timeGetTime这个毫秒级的计时器来解决计时问题。如果timeGetTime还不支持呢?对不起本类只能运行在Windows平台下,谢谢。呵呵。
主要计时代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | double CTimeStat::GetRunTime()//取得运行时间 { double dwSpan; if( m_llCountPreSecond != 0 ) { dwSpan = (double)( m_llTimeEnd - m_llTimeStart ); dwSpan /= m_llCountPreSecond;//执行的秒数 dwSpan *= 1000.0f;//执行的毫秒数 } else { dwSpan = (double)( m_llTimeEnd - m_llTimeStart ); } return dwSpan; } //得当前时间 LONGLONG CTimeStat::_CurTime() { LONGLONG llCount; LARGE_INTEGER ll_Int; if( (0 != m_llCountPreSecond) && QueryPerformanceCounter(&ll_Int) ) { llCount = ll_Int.QuadPart; } else {//如果机器不支持高精度计时器,就采用多媒体计时器 llCount = (LONGLONG)timeGetTime(); } return llCount; } |
测试代码如下:
1 2 3 4 5 6 7 8 9 | CTimeStat ts; ts.StartStat(); for( int i=0 ; i < 20 ; i++) { printf("Welcome to www.vcfans.com\n"); } ts.EndStat(); printf("the time escape : %fms \n",ts.GetRunTime() ); |
下载:
statistics_class (4.0 KiB, 699 hits)
8 条评论
z站长很久没更新了嘛。。
代码编译试过了,我用的是.net,大哥用的是VC吧?程序运行正常,一事不明。
LARGE_INTEGER ll_Int; ll_Int是个整形,怎么又冒出了个QuadPart的属性?没接触过
你误解了,LARGE_INTEGER 是一个Union型的,别被他的名字给欺骗了。
这种方式是基于win32 SDK的一般都可以编过。
奇怪,怎么我没有接触过这种类型??晕~~ 菜,太菜了 继续学习去
我记得VC里面计算代码执行好像不用自己这么麻烦的,time.h里面就有函数取时间的,开始的时候取下,结束的时候再取下,然后相减,这种程序以前我做过的。难道你这个方法的优点是精确度?
对,是基于精确度考虑的。time是纯DOS下的。这种方式是我知道的在Win平台下精度最高的一种方式。
小鸟
汗。