当调用QueryPerformanceCounter时会发生什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

我正在研究在我们的系统中使用QueryPerformanceCounter的确切含义,并试图了解它对应用程序的影响。从我的4核单CPU机器上运行它可以看出,运行它需要大约230 ns。当我在一个24核的4 CPU Xeon上运行它时,它需要大约1.4ms的时间来运行。更有趣的是,在我的机器上,当它在多个线程中运行时,它们不会相互影响。但是在多CPU机器上,线程会导致某种交互,导致它们彼此阻塞。

提问于
用户回答回答于

Windows QueryPerformanceCounter()具有确定处理器数量的逻辑,并在必要时调用同步逻辑。它尝试使用TSC寄存器,但是对于多处理器系统,不能保证处理器之间的同步。

MSDN说,调用哪个处理器并不重要,因此您可能会看到针对这种情况的额外的同步代码会造成开销。还请记住,它可以调用总线传输,因此可能会看到总线争用延迟。

如果可能的话,尝试使用SetThreadAffinityMask()将其绑定到特定的处理器。否则,可能只需忍受延迟,或者可以尝试另一个计时器

用户回答回答于

首先,我同意QueryPerformanceCounter可以在某些机器上花费更多的时间,但我不确定Ron的回答是否一直都是原因。当我对这个问题做一些研究的时候,我发现了一个不同的网页,这些网页讲述了QueryPerformanceCounter是如何实现的。告诉我,Windows,HAL要更具体,就会用不同的定时设备来获得值。这意味着,如果窗口使用较慢的定时设备(如PIT),则需要更多的时间才能获得时间值。显然,使用PIT可能需要PCI事务,因此这是一个原因。

然后,我在VMware站点上找到了更多的信息,因为我不得不与使用VM的客户打交道,我发现使用VM的时间测量还有其他问题。对于那些感兴趣的人,请参考VMware虚拟机中的VMware纸张计时,它还将讨论某些版本的Windows将如何同步每个TSC。因此,在某些情况下使用QueryPerformanceCounter()是安全的,我认为我们应该尝试类似于它的工作方式:SQLServer 2008 R2中的计时器输出建议用于查找调用QueryPerformanceCounter()时可能发生的情况。

扫码关注云+社区