还有一些其他的可能性。
QueryPerformanceCounter 和 QueryPerformanceFrequency
QueryPerformanceCounter将返回一个“性能计数器”,它实际上是一个 CPU 管理的 64 位计数器,从 0 开始随着计算机开机而递增。此计数器的频率由QueryPerformanceFrequency返回。要获得以秒为单位的时间参考,请将性能计数器除以性能频率。在德尔福:
function QueryPerfCounterAsUS: int64;
begin
if QueryPerformanceCounter(Result) and
QueryPerformanceFrequency(perfFreq)
then
Result := Round(Result / perfFreq * 1000000);
else
Result := 0;
end;
在多处理器平台上,QueryPerformanceCounter应该返回一致的结果,而不管线程当前运行在哪个 CPU 上。但是,偶尔会出现问题,通常是由硬件芯片或 BIOS 中的错误引起的。通常,补丁由主板制造商提供。来自 MSDN 的两个示例:
QueryPerformanceCounter 的另一个问题是它非常慢。
RDTSC 指令
如果您可以将代码限制为一个 CPU (SetThreadAffinity),则可以使用RDTSC汇编指令直接从处理器查询性能计数器。
function CPUGetTick: int64;
asm
dw 310Fh // rdtsc
end;
RDTSC 结果以与 QueryPerformanceCounter 相同的频率递增。除以 QueryPerformanceFrequency 以秒为单位获得时间。
QueryPerformanceCounter 比 RDTSC 慢得多,因为它必须考虑到多个 CPU 和可变频率的 CPU。来自Raymon Chen 的博客:
(QueryPerformanceCounter) 计算经过的时间。它必须这样做,因为它的值由 QueryPerformanceFrequency 函数控制,该函数返回一个指定每秒单位数的数字,并且频率被指定为在系统运行时不会改变。
对于可以变速运行的 CPU,这意味着 HAL 不能使用像 RDTSC 这样的指令,因为这与经过的时间无关。
时间获取时间
TimeGetTime属于 Win32 多媒体 Win32 函数。至少在现代硬件上,它以 1 毫秒的分辨率返回以毫秒为单位的时间。如果您在开始测量时间之前运行 timeBeginPeriod(1) 并在完成后运行 timeEndPeriod(1) 并没有什么坏处。
GetLocalTime 和 GetSystemTime
在 Vista 之前,GetLocalTime和 GetSystemTime都以毫秒精度返回当前时间,但它们不能精确到毫秒。它们的精度通常在 10 到 55 毫秒之间。(精度与精度不同)在 Vista 上,GetLocalTime 和 GetSystemTime 都以 1 毫秒的分辨率工作。