首先我们来看一下要用到的两个基本函数:
1、QueryPerformanceCounter Function
The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter.
Syntax
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount
);
Parameters
lpPerformanceCount
[out] Pointer to a variable that receives the current performance-counter value, in counts.
这个函数的作用就是用来获取系统当前时刻的计数值,Windows操作系统在开机后会开始进行一个计数,计数精度可达1μs。
2、QueryPerformanceFrequency Function
The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.
Syntax
BOOL QueryPerformanceFrequency(
LARGE_INTEGER *lpFrequency
);
Parameters
lpFrequency
[out] Pointer to a variable that receives the current performance-counter frequency, in counts per second. If the installed hardware does not support a high-resolution performance counter, this parameter can be zero.
这个函数可以告知我们这个计数器每秒钟的计数值。对每一个确定的系统而言,这个值是恒定不变的。
我们可以设想一下,如果我们在一条指令执行的前后分别获取当时的系统计数值,就能算出它们的差值,把这个差值除以每秒钟的计数值,得出的时间就是指令执行的时间(以秒为单位)。
下面我就用VC来实现这个设想,选择VC主要是因为这个操作用到的这两个API函数属于系统内部资源,使用VC调用起来更方便。而且VC编写的程序,编译效率和执行时间比起其它语言来都有一定优势,可以尽量减少估算误差。
首先我们需要添加要使用的头文件:
除了编写研华程序需要的头文件外,这个测试程序中还需要用到winnt.h,它直接关系到前面提到的两个API函数的调用。
做好这个准备后,我们编写一个简单界面
当点击“Test”按钮时,会完成我上面设想的操作,计算出指令时间,并且显示在界面上。
首先我们获取系统的频率并显示在界面上
这一步是分别获取指令前后的两个计数值。
***后是计算指令时间并显示。
我们可以看看程序的执行效果:
如上图所示,我测试的指令是DRV_DeviceClose(),选择的设备是研华自己的DEMO BOARD,多次测试结果表明,这个函数的执行时间基本上在3-7个μs之间。
而在同样的软硬件环境下,测试DRV_DeviceOpen()指令,执行时间在1ms左右,两种指令的执行时间差距在两个数量级以上。
使用,这种方法,我们可以对多种研华DAS卡函数作出基本指令时间的推算,会在后续推出这方面的专题。