测试准备:计时与中断

    对于速度测试,计时精度是非常重要的。这里要测试的部件都是以数百兆的频率运行的高速部件,对计时精度要求就更高了。在现在的X86体系机构下,可得到的精度最高的计时方法是RDTSC指令。该指令理论上可达CPU主频周期级精度。而且附加开销比其它手段都小(仅1条指令:应该是在无其它附加硬件情况下可得到的最小附加开销计算方法)。在测试中所有的计时都将采用这个方法。具体细节请参考Intel的相关文档。如何从RDTSC指令获得机器计时信息和把通过RDTSC获得的时间转换成普通时间单位(秒等)的方法都可以在Intel的网站上找到。

    虽然RDTSC的计时精度很高,这里仍然有一个问题:中断。中断的发生是不可预期的,如果发生在测试循环的中间,中断处理的时间将被计算到测试函数运行时间中。在现代操作系统的多任务环境下,中断处理可能很复杂,会对测试结果有很大影响,特别是运行时间很短的测试函数。

    理想的情况是关中断,然后再运行测试函数。但多任务环境下,关中断是特权指令,不能在用户态执行。如果写驱动程序,把测试函数放到核心态执行,是最完美的处理方法。但这样做工作量比较大,而且牵涉面太广,容易出错,程序也没有几个人可以看懂。所以我们还是考虑在用户态尽量避免中断的干扰。

    我们结合考虑这几个方法来消除中断的影响:(1)缩短运行时间;(2)提高程序优先级;(3)多次测试,取最短的运行时间为测量值。

    由于计时方法RDTSC的精度相当高,可以精确测试非常短的时间间隔(例如:数微秒),我们适当减少测试循环次数,使测试函数运行得尽量快一些。这样在测试函数运行的这段时间内发生中断的概率就小了很多。

    提高程序优先级并不能防止中断的发生,但可以减少其它不必要的影响,特别是其它进程的影响。根据Win32 API的文档,测试中将程序的优先级提高到31。按M$的说法,这个优先级比所有中断服务函数(不是中断响应函数)的优先级还高。Windows处理中断的步骤是:(1)中断响应函数响应中断,记录最必要的信息,并启动一个较低优先级的中断服务函数;(2)中断服务函数具体处理中断,管理设备。把程序优先级提高到31,可以使中断步骤中(2)必须在测试函数推出后才能被执行。当然这有多少作用还不清楚。

    另外,多次运行测试函数,有一次运行没有被中断的概率也增加。取其运行最快的一次作为测试值也是合理的。在测试中,测试函数将被运行20次左右,再取最小值作为测试值。

    关于计时与中断,希望有人能够提供更好的解决办法!


Leading Cloud Surveillance, Recording and Storage service; IP camera live viewing

Leading Enterprise Cloud IT Service; cloud file server, FTP Hosting, Online Storage, Backup and Sharing

Powered by FirstCloudIT.com, a division of DriveHQ, the leading Cloud IT and Cloud Surveillance Service provider since 2003.