我需要找出我的应用程序中的函数所花费的时间。应用程序是MS VIsual Studio 2005解决方案,所有C代码。
我使用了Windows API GetLocalTime(SYSTEMTIME *)来获取我想要测量时间的函数调用之前和之后的当前系统时间。 但这有缺点,它的最低分辨率只有1毫秒。没有什么比这更好了。所以我不能在微秒内获得任何时间粒度。
我知道time()给出了自纪元时间以来经过的时间,也有1毫秒(无微秒)的分辨率
1。)是否还有其他Windows API提供时间(以微秒为单位),我可以使用它来衡量我的功能消耗的时间?
-AD
答案 0 :(得分:10)
还有其他一些可能性。
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的另一个问题是它很慢。
如果您可以将代码限制为一个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属于Win32多媒体Win32功能。它以毫秒为单位返回时间,分辨率为1 ms,至少在现代硬件上。如果你在开始测量时间和timeEndPeriod(1)之前运行timeBeginPeriod(1)就不会受到伤害。
在Vista之前,GetLocalTime和GetSystemTime都以毫秒精度返回当前时间,但它们不准确到毫秒。它们的准确度通常在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”。有关详情,请查看QueryPerformanceCounter和QueryPerformanceCounterFrequency。