调用QueryPerformanceCounter时会发生什么?

Mat*_*ice 19 c++ windows winapi timing

我正在研究在我们的系统中使用QueryPerformanceCounter的确切含义,并试图了解它对应用程序的影响.我可以看到在我的4核单CPU机器上运行它需要大约230ns才能运行.当我在24核4 cpu xeon上运行它需要大约1.4ms才能运行.更有趣的是,在我的机器上运行多个线程时,它们不会相互影响.但是在多CPU机器上,线程会导致某种交互,导致它们相互阻塞.我想知道他们都在查询总线上是否有一些共享资源?当我调用QueryPerformanceCounter时它到底发生了什么?它真正测量了什么?

Ron*_*lic 10

Windows QueryPerformanceCounter()具有确定处理器数量的逻辑,并在必要时调用同步逻辑.它试图使用TSC寄存器但是对于多处理器系统,不能保证该寄存器在处理器之间同步(更重要的是,由于智能的低频和睡眠状态,它可以变化很大).

MSDN表示调用哪个处理器无关紧要,因此您可能会看到针对此类情况的额外同步代码会导致开销.还要记住,它可以调用总线传输,因此您可能会看到总线争用延迟.

如果可能,尝试使用SetThreadAffinityMask()将其绑定到特定处理器.否则你可能不得不忍受延迟,或者你可以尝试不同的计时器(例如,看看http://en.wikipedia.org/wiki/High_Precision_Event_Timer).