生活的天平本不平衡,只有通过努力改变其偏向。

高精度计时器,计算代码执行时间类下载

2008-07-26

下午闲着无聊,写了一个类,用于统计代码执行时间。本类采用高精度计时器实现,主要有两个函数。

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就是执行所需要的秒数。

但是如果遇上一个骨灰级的机器加人品又不好,不支QueryPerformanceFrequencyQueryPerformanceCounter怎么搞呢?我在代码中使用了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, 656 hits)

作者:lonkil | 分类目录:本站原创编程开发 | 标签:

8 条评论

  1. leonardo 说道:

    z站长很久没更新了嘛。。

  2. biweilun 说道:

    代码编译试过了,我用的是.net,大哥用的是VC吧?程序运行正常,一事不明。
    LARGE_INTEGER ll_Int; ll_Int是个整形,怎么又冒出了个QuadPart的属性?没接触过

    • lonkil 说道:

      你误解了,LARGE_INTEGER 是一个Union型的,别被他的名字给欺骗了。
      这种方式是基于win32 SDK的一般都可以编过。

      • biweilun 说道:

        奇怪,怎么我没有接触过这种类型??晕~~ 菜,太菜了 继续学习去

  3. biweilun 说道:

    我记得VC里面计算代码执行好像不用自己这么麻烦的,time.h里面就有函数取时间的,开始的时候取下,结束的时候再取下,然后相减,这种程序以前我做过的。难道你这个方法的优点是精确度?

    • lonkil 说道:

      对,是基于精确度考虑的。time是纯DOS下的。这种方式是我知道的在Win平台下精度最高的一种方式。

  4. leonardo 说道:

    小鸟