GetLocalTime()API时间分辨率

时间:2008-09-08 13:09:27

标签: c profile

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

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

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

1。)是否还有其他Windows API提供时间(以微秒为单位),我可以使用它来衡量我的功能消耗的时间?

-AD

4 个答案:

答案 0 :(得分:10)

还有其他一些可能性。

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;

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

QueryPerformanceCounter的另一个问题是它很慢。

RDTSC指令

如果您可以将代码限制为一个CPU(SetThreadAffinity),则可以使用RDTSC汇编程序指令直接从处理器查询性能计数器。

function CPUGetTick: int64;
asm
  dw 310Fh // rdtsc
end;

RDTSC结果以与QueryPerformanceCounter相同的频率递增。将它除以QueryPerformanceFrequency,以秒为单位获得时间。

QueryPerformanceCounter比RDTSC要慢得多,因为它必须考虑多个CPU和频率可变的CPU。来自Raymon Chen's blog

  

(QueryPerformanceCounter)计算经过的时间。它必须,因为它的价值   由QueryPerformanceFrequency函数控制,该函数返回一个数字   指定每秒的单位数,并且频率指定为不   在系统运行时更改。

     

对于可以以可变速度运行的CPU,这意味着HAL不能   使用像RDTSC这样的指令,因为它与经过的时间无关。

timeGetTime

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

GetLocalTime和GetSystemTime

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

答案 1 :(得分:2)

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

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

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

Al Weiner

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

在Windows上,您可以使用“高性能计数器API”。有关详情,请查看QueryPerformanceCounterQueryPerformanceCounterFrequency