当前位置:  开发笔记 > IOS > 正文

GetLocalTime()API时间分辨率

如何解决《GetLocalTime()API时间分辨率》经验,为你挑选了1个好方法。

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

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

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

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

-广告



1> gabr..:

还有其他一些可能性.

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函数的程序在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多媒体Win32功能.它以毫秒为单位返回时间,分辨率为1 ms,至少在现代硬件上.如果在开始测量时间之前运行timeBeginPeriod(1)并且在完成时测量timeEndPeriod(1),则不会受到伤害.

GetLocalTime和GetSystemTime

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有