11.11

1. 硬件时标计数器的发展
起初的 IBM PC 是不包含任何硬件时标计数器的。它确实有一个记录一天之中的时间的
时钟,软件也可以读取这个时间。最早的微软的 C 运行时库复制了 ANSI C 库,提供了
time_t time(time_t*) 函数。该函数会返回一个距离 UTC 时间 1970  1  1  0:00 的秒
数。旧版本的 time() 函数返回的是一个 32 位有符号整数,但是在经历了 Y2K3 之后,它被
修改成了一个 64 位的有符号整数。
起初的 IBM PC 会使用来自交流电源的周期性的中断来唤醒内核去进行任务切换或是进行
其他内核操作。在北美,这个周期是 16.67 毫秒,因为交流电源是 60Hz 的。如果交流电
源是 50Hz 的话,这个周期就是 20 毫秒。

 Windows 98(可能更早)以来,微软的 C 运行时提供了 ANSI C 函数 clock_t clock()
该函数会返回一个有符号形式的时标计数器。常量 CLOCKS_PER_SEC 指定了每秒钟的时标的
次数。返回值为 -1 表示 clock() 不可用。clock() 会基于交流电源的周期性中断记录时标。
clock()  Windows 上的实现方式与 ANSI 所规定的不同,在 Windows 上它所测量的是经
过时间而非 CPU 时间 4。最近,clock() 被根据 GetSystemTimeAsfileTime() 重新实现了。在
2015 年时它的时标是 1 毫秒,分辨率也是 1 毫秒。这使得它成了 Windows 上一个优秀的
毫秒级别的时钟.

 Windows 2000 开始,可以通过调用 DWORD GetTickCount() 来实现基于 A/C 电源中断的
软件时标计数器。GetTickCount() 的时标计数值取决于 PC 的硬件,可能会远比 1 毫秒长。
GetTickCount() 会进行一次将时标转换为毫秒的计算来消除部分不确定性。这个方法的一
个升级版是 ULONGLONG GetTickCount64(),它会以 64 位无符号整数的形式返回相同的时标

计数值,这样可以测量更长的处理时间。虽然没有办法知道当前的中断周期,但下面这对
函数可以缩短和然后恢复周期:
MMRESULT timeBeginPeriod(UINT)
MMRESULT timeEndPeriod(UINT)
这两个函数作用于全局变量上,会影响所有的进程和其他函数,如取决于交流电源的中断
周期的 Sleep()。另外一个函数 DWORD timeGetTime() 可以通过另一种方法获取相同的时标
计数值。

1. 硬件时标计数器的发展
起初的 IBM PC 是不包含任何硬件时标计数器的。它确实有一个记录一天之中的时间的
时钟,软件也可以读取这个时间。最早的微软的 C 运行时库复制了 ANSI C 库,提供了
time_t time(time_t*) 函数。该函数会返回一个距离 UTC 时间 1970  1  1  0:00 的秒
数。旧版本的 time() 函数返回的是一个 32 位有符号整数,但是在经历了 Y2K3 之后,它被
修改成了一个 64 位的有符号整数。
起初的 IBM PC 会使用来自交流电源的周期性的中断来唤醒内核去进行任务切换或是进行
其他内核操作。在北美,这个周期是 16.67 毫秒,因为交流电源是 60Hz 的。如果交流电
源是 50Hz 的话,这个周期就是 20 毫秒。

 Windows 98(可能更早)以来,微软的 C 运行时提供了 ANSI C 函数 clock_t clock()
该函数会返回一个有符号形式的时标计数器。常量 CLOCKS_PER_SEC 指定了每秒钟的时标的
次数。返回值为 -1 表示 clock() 不可用。clock() 会基于交流电源的周期性中断记录时标。
clock()  Windows 上的实现方式与 ANSI 所规定的不同,在 Windows 上它所测量的是经
过时间而非 CPU 时间 4。最近,clock() 被根据 GetSystemTimeAsfileTime() 重新实现了。在
2015 年时它的时标是 1 毫秒,分辨率也是 1 毫秒。这使得它成了 Windows 上一个优秀的
毫秒级别的时钟.

 Windows 2000 开始,可以通过调用 DWORD GetTickCount() 来实现基于 A/C 电源中断的
软件时标计数器。GetTickCount() 的时标计数值取决于 PC 的硬件,可能会远比 1 毫秒长。
GetTickCount() 会进行一次将时标转换为毫秒的计算来消除部分不确定性。这个方法的一
个升级版是 ULONGLONG GetTickCount64(),它会以 64 位无符号整数的形式返回相同的时标

计数值,这样可以测量更长的处理时间。虽然没有办法知道当前的中断周期,但下面这对
函数可以缩短和然后恢复周期:
MMRESULT timeBeginPeriod(UINT)
MMRESULT timeEndPeriod(UINT)
这两个函数作用于全局变量上,会影响所有的进程和其他函数,如取决于交流电源的中断
周期的 Sleep()。另外一个函数 DWORD timeGetTime() 可以通过另一种方法获取相同的时标
计数值。

posted @ 2024-12-16 14:28  欧吼吼  阅读(2)  评论(0编辑  收藏  举报