11.12
奔腾体系结构后,英特尔提供了一个叫作时间戳计数器(Time Stamp Counter,TSC)的
硬件寄存器。TSC 是一个从处理器时钟中计算时标数的 64 位寄存器。RDTSC 指令可以非常
快地访问该寄存器。
自 Windows 2000 问 世 后, 可 以 通 过 调 用 函 数 BOOL Query PerformanceCounter(LARGE_
INTEGER*) 来读取 TSC,这将会产生一次特殊的不带分辨率的时标计数。可以通过调用
BOOL QueryPerformanceFrequency(LARGE_INTEGER*) 来获得分辨率,它会返回每秒钟时标的
频率。LARGE_INTEGER 是一个带有有符号格式的 64 位整数的结构体,因为在当时引入了以
上这些函数的 Visual Studio 中还没有原生的 64 位有符号整数类型。
初始版本的 QueryPerformanceCounter() 的一个问题是,它的时标速率取决于处理器的时
钟。不同处理器和主板的处理器时钟不同。在当时,老式的 PC,特别是那些使用超微半
导 体 公 司(Advanced Micro Devices,AMD) 处 理 器 的 PC 是 没 有 TSC 的。 在 当 时 没 有
TSC 可用的情况下,QueryPerformanceCounter() 会返回 GetTickCount() 返回的低分辨率的
时标计数值。
硬件寄存器。TSC 是一个从处理器时钟中计算时标数的 64 位寄存器。RDTSC 指令可以非常
快地访问该寄存器。
自 Windows 2000 问 世 后, 可 以 通 过 调 用 函 数 BOOL Query PerformanceCounter(LARGE_
INTEGER*) 来读取 TSC,这将会产生一次特殊的不带分辨率的时标计数。可以通过调用
BOOL QueryPerformanceFrequency(LARGE_INTEGER*) 来获得分辨率,它会返回每秒钟时标的
频率。LARGE_INTEGER 是一个带有有符号格式的 64 位整数的结构体,因为在当时引入了以
上这些函数的 Visual Studio 中还没有原生的 64 位有符号整数类型。
初始版本的 QueryPerformanceCounter() 的一个问题是,它的时标速率取决于处理器的时
钟。不同处理器和主板的处理器时钟不同。在当时,老式的 PC,特别是那些使用超微半
导 体 公 司(Advanced Micro Devices,AMD) 处 理 器 的 PC 是 没 有 TSC 的。 在 当 时 没 有
TSC 可用的情况下,QueryPerformanceCounter() 会返回 GetTickCount() 返回的低分辨率的
时标计数值。