我想在Windows平台上以微秒精度计算函数的性能。
现在Windows本身具有毫秒级的粒度,所以我怎样才能做到这一点。
我尝试过以下示例,但没有得到正确的结果。
LARGE_INTEGER ticksPerSecond = {0};
LARGE_INTEGER tick_1 = {0};
LARGE_INTEGER tick_2 = {0};
double uSec = 1000000;
// Get the frequency
QueryPerformanceFrequency(&ticksPerSecond);
//Calculate per uSec freq
double uFreq = ticksPerSecond.QuadPart/uSec;
// Get counter b4 start of op
QueryPerformanceCounter(&tick_1);
// The ope itself
Sleep(10);
// Get counter after opfinished
QueryPerformanceCounter(&tick_2);
// And now the op time in uSec
double diff = (tick_2.QuadPart/uFreq) - (tick_1.QuadPart/uFreq);
答案 0 :(得分:20)
循环运行操作一百万次左右,并将结果除以该数字。这样你就可以获得平均执行时间。由于多任务和诸如此类的原因,对一个非常快速的操作执行一次(甚至一百次)非常不可靠。
答案 1 :(得分:7)
(男人,我将为这个答案投票选票)
答案 2 :(得分:3)
不,你可能得到了一个准确的结果,QueryPerformanceCounter()适用于短时间间隔。你对Sleep()准确性的期望是什么错。它的分辨率为1毫秒,其精度要差得多。在大多数Windows机器上,不超过大约15.625毫秒。
要使其接近1毫秒,您必须先调用timeBeginPeriod(1)。这可能会改善匹配,忽略你从Windows作为多任务操作系统获得的抖动。
答案 3 :(得分:0)
如果您正在执行此操作以进行离线分析,一种非常简单的方法是运行该函数1000次,测量到最接近的毫秒并除以1000.
答案 4 :(得分:0)
要获得比1 ms更精细的分辨率,您必须查阅您的操作系统文档。可能有API可以获得微秒分辨率的定时器分辨率。如果是这样,请多次运行您的应用程序并取平均值。
答案 5 :(得分:0)
我喜欢Matti Virkkunen的回答。检查时间,多次调用该功能,检查完成时间,然后除以调用该功能的次数。他确实提到过你可能会因操作系统中断而关闭。您可以改变拨打电话的次数并查看差异。你能提高这个过程的优先级吗?你可以在单个操作系统时间片内获得所有调用吗?
由于你不知道操作系统什么时候可能会把你换掉,你可以把它全部放在一个更大的循环中来进行大量的整个测量,并保存最小的数字,因为那是有一个最少的操作系统中断。这仍然可能大于函数执行的实际时间,因为它可能仍然包含一些OS中断。
答案 6 :(得分:0)
Sanjeet,
看起来(对我而言)就像你这样做完全正确。 QueryPerformanceCounter是一种非常好的方法,可以高精度地测量短时间段。如果你没有看到你期望的结果,那很可能是因为睡眠没有在你预期的时间内睡觉!但是,它可能正确测量。
我想回到原来的问题,关于如何以微秒精度测量窗口上的时间。如您所知,高性能计数器(即QueryPerformanceCounter)以QueryPerformanceFrequency报告的频率“滴答”。这意味着您可以精确测量时间等于:
1 /频率秒
在我的机器上, QueryPerformanceFrequency报告2337910(计数/秒)。这意味着我的计算机的QPC可以精确测量4.277e-7秒,或0.427732微秒。这意味着我可以测量的最小时间是0.427732微秒。当然,这可以为您提供最初要求的精度:)您的机器频率应该相似,但您可以随时进行数学运算并进行检查。
答案 7 :(得分:-1)
或者你可以使用gettimeofday(),它为你提供一个时间戳结构,它是一个时间戳(低至μs)