GetLocalTime()API时间分辨率

我需要找出我的应用程序中的函数所花费的时间。 应用程序是MS VIsual Studio 2005解决方案,所有C代码。

我使用了Windows API GetLocalTime(SYSTEMTIME *)来获取我想要测量时间的函数调用之前和之后的当前系统时间。 但这有缺点,它的最低分辨率只有1毫秒。 没有什么比这更好了。 所以我不能在微秒内获得任何时间粒度。

我知道time()给出了自纪元时间以来经过的时间,也有1毫秒的分辨率(无微秒)

1.)是否有任何其他Windows API提供微秒的时间,我可以用它来衡量我的function消耗的时间?

-广告

还有其他一些可能性。

QueryPerformanceCounter和QueryPerformanceFrequency

QueryPerformanceCounter将返回一个“性能计数器”,它实际上是一个CPU管理的64位计数器,从计算机开机开始,从0开始递增。 QueryPerformanceFrequency返回此计数器的频率。 要以为单位获取时间参考,请按性能频率划分性能计数器。 在delphi:

function QueryPerfCounterAsUS: int64; begin if QueryPerformanceCounter(Result) and QueryPerformanceFrequency(perfFreq) then Result := Round(Result / perfFreq * 1000000); else Result := 0; end; 

在多处理器平台上,无论当前运行的线程是什么CPU,QueryPerformanceCounter 都应返回一致的结果。 但是,偶尔会出现问题,通常是由硬件芯片或BIOS中的错误引起的。 通常,补丁由主板制造商提供。 来自MSDN的两个例子:

  • 使用QueryPerformanceCounter函数的程序在Windows Server 2003和Windows XP中可能表现不佳
  • 性能计数器值可能意外地向前跃进

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

TimeGetTime属于Win32多媒体Win32function。 它以毫秒为单位返回时间,分辨率为1 ms,至少在现代硬件上是这样。 如果你在开始测量时间和timeEndPeriod(1)之前运行timeBeginPeriod(1)并没有受到伤害。

GetLocalTime和GetSystemTime

在Vista之前, GetLocalTime和GetSystemTime都以毫秒精度返回当前时间,但它们不精确到毫秒。 它们的准确度通常在10到55毫秒的范围内。 ( 精度与精度不同 )在Vista上,GetLocalTime和GetSystemTime都以1 ms的分辨率工作。

多处理器系统的一个注意事项:

来自http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx

在多处理器计算机上,调用哪个处理器无关紧要。 但是,由于基本输入/输出系统(BIOS)或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的结果。 要指定线程的处理器关联,请使用SetThreadAffinityMask函数。

艾维纳

您可以尝试使用clock() ,它将提供两点之间的“滴答”数。 “tick”是处理器可以测量的最小时间单位。

作为旁注,您不能使用clock()来确定实际时间 – 只能使用程序中两点之间的刻度数。

在Windows上,您可以使用“高性能计数器API”。 查看: QueryPerformanceCounter和QueryPerformanceCounterFrequency以获取详细信息。