一、先计算每秒多少个计数
typedef __int64 s64;
s64 tps; /* timestamp counter per second */
s64 get_tps(void)
{
s64 t0 = rdtsc();
Sleep(100);
return (rdtsc() - t0) * 10;
}
这段代码定义了一个函数 get_tps
,该函数用于测量处理器的时间戳计数器(RDTSC)每秒的计数率。
具体来说:
rdtsc()
是一个函数,通常在 x86 架构的处理器上使用,用于读取处理器的时间戳计数器。这个计数器通常每处理器周期增加一次,因此,通过读取这个计数器的值,我们可以得到处理器的运行速度的一个大致估计。get_tps
函数首先读取时间戳计数器的当前值(t0
)。- 然后,它使程序暂停(或“睡眠”)100毫秒。
- 之后,它再次读取时间戳计数器的值,并从第二次读取的值中减去第一次读取的值。
- 最后,它用所得的结果乘以10来计算在100毫秒内的时间戳计数器的计数。这个值乘以10是因为我们测量的是100毫秒内的计数,而我们需要的是每秒的计数率。
所以,这个函数返回的是处理器在100毫秒内的时钟周期数。这可以用来大致估计处理器的速度。例如,如果这个函数返回100000000,那么这意味着处理器在100毫秒内运行了大约10亿个时钟周期,或者说它每秒运行了大约10亿个时钟周期。
二、获取当前时间的总计数
typedef __int64 s64;
s64 rdtsc(void)
{
LARGE_INTEGER a;
QueryPerformanceCounter(&a);
return (s64)a.QuadPart;
}
这个函数使用了Windows API中的QueryPerformanceCounter
函数来获取当前处理器的时间戳计数器的值,并返回一个64位整数表示的该值。
具体来说:
QueryPerformanceCounter(&a)
调用会获取当前处理器的时间戳计数器的值,并存储在a
变量中。- 然后,函数将
a.QuadPart
(这是一个64位整数的组成部分)转换为s64
类型的返回值。
这个函数通常用于测量程序运行的时间或计算性能。通过比较两个时间戳计数器的值,可以计算出两个时间点之间的时间差。
三、使用
int main(void)
{
tps = get_tps();
t1 = rdtsc();
//待测试的函数
t2 = rdtsc();
printf("用时:%.3f\n", (double)(t2 - t1) / tps);
return 0;
}