Timer 使用 Windows 的 WM_TIMER 实现,内部也要遵循时钟周期的精度,而时钟周期的精度也是直接影响任务调度的因素,如果精度过高,那么中断处理程序将会大量占用 CPU 时间片,从而导致其它进程无法正确运行,因此现代抢占式多任务操作系统的时间周期的精度通常都是几十个毫秒,这样可以允许进程得到充分的时间片运行,因此事实上 Timer 根本不可能精确到 0.0001s,而是和 Windows 的时钟中断精度相一致,通常在几十个毫秒,随着不同版本的不同配置(如 Server OS 和 PC OS 就不同,Linux 等的配置也有所不同)可能会有不同,但数量级一定都是在几十个毫秒,否则进程得到的时间片将非常少。(也就是使用 Linux 下的 time 命令得到的用户时间和系统时间的比例会不协调)
QueryPerformanceCounter() 是用于提高精度的方法,因为在 Intel 架构的 CPU 下它是调用 IA32 的指令 rdtsc 来实现的,在其它架构的 CPU 中会用其它方法。在 Ring0 下的操作系统内核程序也可以使用等价的 rdmsr 来读取 MSR 寄存器,也就是时间计数器,这两条指令的级别一般都是微秒级的,而且随着不同的 CPU 有不同的意义,数量级都是微秒。
但是还是由于抢占式多任务操作系统的关系,Windows 事实上由于多任务的调度和多种中断尤其是时钟中断的处理关系,这个 API 或汇编指令能够达到的精度也是十分有限,同时也十分不稳定。在不同的系统负载下会有很不同的表现,差距甚至可以达到几十倍。
综上,如果只是大致需要精确到 0.00001s(例如流媒体播放),那用 QueryPerformanceCounter() 或者 rdtsc 指令都是可以的,但是如果是用于严格的时间控制(例如医院中的生命体征监控系统),那么一定不要用 Windows 这样的多任务抢占式操作系统,而要使用相应的实时操作系统(Real-time OS),实时系统允许程序员完全控制 CPU 的周期,甚至可以协调不同硬件时间的周期频率,达到完全精确的记时。