What happens when QueryPerformanceCounter is called?(当 QueryPerformanceCounter 被调用时会发生什么?)
问题描述
我正在研究在我们的系统中使用 QueryPerformanceCounter 的确切含义,并试图了解它对应用程序的影响.从我的 4 核单 CPU 机器上运行它可以看出,它需要大约 230ns 才能运行.当我在 24 核 4 cpu xeon 上运行它时,它需要大约 1.4 毫秒才能运行.更有趣的是,在我的机器上以多个线程运行时,它们不会相互影响.但是在多 CPU 机器上,线程会引起某种交互,导致它们相互阻塞.我想知道总线上是否有一些他们都查询的共享资源?当我调用 QueryPerformanceCounter 时到底发生了什么,它真正衡量的是什么?
I'm looking into the exact implications of using QueryPerformanceCounter in our system and am trying to understand it's impact on the application. I can see from running it on my 4-core single cpu machine that it takes around 230ns to run. When I run it on a 24-core 4 cpu xeon it takes around 1.4ms to run. More interestingly on my machine when running it in multiple threads they don't impact each other. But on the multi-cpu machine the threads cause some sort of interaction that causes them to block each other. I'm wondering if there is some shared resource on the bus that they all query? What exactly happens when I call QueryPerformanceCounter and what does it really measure?
推荐答案
Windows QueryPerformanceCounter() 具有确定处理器数量并在必要时调用同步逻辑的逻辑.它尝试使用 TSC 寄存器,但对于多处理器系统,不能保证该寄存器在处理器之间同步(更重要的是,由于智能降频和睡眠状态,可能会有很大差异).
Windows QueryPerformanceCounter() has logic to determine the number of processors and invoke syncronization logic if necessary. It attempts to use the TSC register but for multiprocessor systems this register is not guaranteed to be syncronized between processors (and more importantly can vary greatly due to intelligent downclocking and sleep states).
MSDN 说调用哪个处理器无关紧要,因此您可能会看到额外的同步代码导致这种情况的开销.另请记住,它可以调用总线传输,因此您可能会看到总线争用延迟.
MSDN says that it doesn't matter which processor this is called on so you may be seeing extra syncronization code for such a situation cause overhead. Also remember that it can invoke a bus transfer so you may be seeing bus contention delays.
如果可能,请尝试使用 SetThreadAffinityMask() 将其绑定到特定处理器.否则,您可能不得不忍受延迟,或者您可以尝试不同的计时器(例如查看 http://en.wikipedia.org/wiki/High_Precision_Event_Timer).
Try using SetThreadAffinityMask() if possible to bind it to a specific processor. Otherwise you might just have to live with the delay or you could try a different timer (for example take a look at http://en.wikipedia.org/wiki/High_Precision_Event_Timer).
这篇关于当 QueryPerformanceCounter 被调用时会发生什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:当 QueryPerformanceCounter 被调用时会发生什么?
基础教程推荐
- CString 到 char* 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 初始化列表*参数*评估顺序 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
