在EVC里,如何计时?

zhangle8311   2008-10-18 09:31 楼主
注意 ,在这里我说的不是定时,而是计时,也就是从程序的某个地方开始到某个语句结束时系统花费的时间 ,最好精确到微妙 。。
谢谢赐教

回复评论 (8)

GetTickCount()应该可以吧
点赞  2008-10-18 11:15
别人的文章:估计能够满足你的要求,文中提到的书和源码eeworld上都有。
本文要介绍的,是另一种直接利用Pentium CPU内部时间戳进行计时的高精度计时手段。以下讨论主要得益于《Windows图形编程》一书,第 15页-17页,有兴趣的读者可以直接参考该书。关于RDTSC指令的详细讨论,可以参考Intel产品手册。本文仅仅作抛砖之用。
在 Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。这个精确性是上述两种方法所无法比拟的。
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:
inline unsigned __int64 GetCycleCount()
{
__asm RDTSC
}
但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样:
unsigned long t;
t = (unsigned long)GetCycleCount();
//Do Something time-intensive ...
t -= (unsigned long)GetCycleCount();
点赞  2008-10-18 13:21
INTEL SANYANG 可以这样使用吗
点赞  2008-10-18 16:26
2楼说得是x86,在arm上不能用.
精确到微秒不可能,GetTickCount()一般可以精确到ms
点赞  2008-10-19 18:06
用GetTickCount(),但好像不能精确到us...
点赞  2008-10-20 09:53
GetTickCount一般返回ms级别。

除非你的驱动支持,才能返回us的。

可以用QueryPerformanceCounter和 QueryPerformanceFrequency来查看你的硬件支持什么级别的。

一般返回1000,是指ms级别的。
点赞  2008-10-20 10:03
QueryPerformanceFrequency 是最准确的方法了
但是要准确到1ms都不差, 有点困难.
点赞  2008-10-20 15:38
6楼说的是对的,我没有注意到你的精度的要求
点赞  2008-10-20 17:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复