我需要找出我的应用程序中的函数所花费的时间.应用程序是MS VIsual Studio 2005解决方案,所有C代码.
我使用了Windows API GetLocalTime(SYSTEMTIME*)来获取函数调用之前和之后的当前系统时间,我想测量它的时间.但这有缺点,它的最低分辨率只有1毫秒.没有什么比这更好了.所以我不能在微秒内获得任何时间粒度.
我知道time()给出了自纪元时间以来经过的时间,也有1毫秒(无微秒)的分辨率
1.)是否有任何其他Windows API提供微秒的时间,我可以用来测量我的功能消耗的时间?
-广告
还有其他一些可能性.
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函数的程序在Windows Server 2003和Windows XP中可能表现不佳
性能计数器值可能意外地向前跃进
QueryPerformanceCounter的另一个问题是它很慢.
如果可以将代码限制为一个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 ms,至少在现代硬件上.如果在开始测量时间之前运行timeBeginPeriod(1)并且在完成时测量timeEndPeriod(1),则不会受到伤害.
在Vista之前,GetLocalTime和 GetSystemTime都以毫秒精度返回当前时间,但它们不精确到毫秒.它们的准确度通常在10到55毫秒的范围内.(精度与精度不同)在Vista上,GetLocalTime和GetSystemTime都以1 ms的分辨率工作.