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以获取详细信息。