访问处理器计时器
测量较小时间间隔的尝试经常受到作为操作系统一部分的间歇后台活动以及系统时间例程消耗的处理时间的阻挠而失败。 解决此问题的一个途径是直接访问处理器计时器来确定测量时间间隔的开始和结束的时间,并运行重复测量,然后过滤结果以除去中断干扰时的时间段。
POWER ® 和 POWER2 体系结构将处理器计时器实现为一对特殊用途寄存器。 基于 POWER 处理器的 体系结构定义称为 TimeBase的 64 位寄存器。 只有汇编语言程序可以访问这些寄存器。
注: 处理器计时器测量的时间是绝对挂钟时间。 如果对计时器各访问间产生了中断,那么计算出的持续时间将包括中断处理时间和控制返回给计时的代码前可能分派给其他进程的时间。 来自处理器计时器的时间是原始时间且不应该用于将不接受合理测试的情况。
一组三个库子例程使得对 TimeBase 寄存器的访问与体系结构无关。 这些子例程如下:
- read_real_time()
- 这个子例程包含来自合理源的当前时间并将它存储为两个 32 位值。
- read_wall_time()
- 该子例程从相应的源获取原始 TimeBase 寄存器值,并将其作为两个 32 位值存储。
- time_base_to_time()
- 这个子例程确保时间值以秒和纳秒的形式表示,执行任何源自 TimeBase 的必需的转化。
时间采集和时间转换函数是分隔开的,这是为了使时间采集的开销达到最小。
下面的示例演示如何使用 read_real_time() 和 time_base_to_time() 子例程来测量特定代码段的耗用时间:
#include <stdio.h>
#include <sys/time.h>
int main(void) {
timebasestruct_t start, finish;
int val = 3;
int w1, w2;
double time;
/* get the time before the operation begins */
read_real_time(&start, TIMEBASE_SZ);
/* begin code to be timed */
printf("This is a sample line %d \n", val);
/* end code to be timed */
/* get the time after the operation is complete
read_real_time(&finish, TIMEBASE_SZ);
/* call the conversion routines unconditionally, to ensure */
/* that both values are in seconds and nanoseconds regardless */
/* of the hardware platform. */
time_base_to_time(&start, TIMEBASE_SZ);
time_base_to_time(&finish, TIMEBASE_SZ);
/* subtract the starting time from the ending time */
w1 = finish.tb_high - start.tb_high; /* probably zero */
w2 = finish.tb_low - start.tb_low;
/* if there was a carry from low-order to high-order during */
/* the measurement, we may have to undo it. */
if (w2 < 0) {
w1--;
w2 += 1000000000;
}
/* convert the net elapsed time to floating point microseconds */
time = ((double) w2)/1000.0;
if (w1 > 0)
time += ((double) w1)*1000000.0;
printf("Time was %9.3f microseconds \n", time);
exit(0);
}要最大限度减少从计时器例程调用和返回的开销,您可以尝试绑定基准程序非共享 (请参阅 何时使用动态链接和静态链接)。
如果这是真实性能基准,那么会反复测量代码。 大量连续的重复操作可合并计时,并由此计算操作的平均时间,但是这些时间可能包括中断处理时间或者其他外部活动时间。 如果对大量重复操作进行逐个计时,那么可以检查各个时间以判断其合理性,但是每次测量可能包括计时例程的开销。 希望您能使用两种技术并比较它们的结果。 任何情况下,在选择方法时都需要考虑测量的目的。