如何以微秒精度计算操作时间

时间:2010-05-13 13:03:56

标签: c++ c windows performance precision

我想在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);

8 个答案:

答案 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)