gpt4 book ai didi

c++ QueryPerformanceCounter 性能峰值

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:55 25 4
gpt4 key购买 nike

我创建了一个简单的程序来确定 QueryPerformanceCounter 调用需要多长时间。在我的计算机上大约需要 8 纳秒,但有时我会看到每次调用出现高达 500 微秒的峰值。

一些细节:
Visual Studio 2013,C++

LARGE_INTEGER ll;
QueryPerformanceFrequency(&ll);
int steps = 10000000;
LARGE_INTEGER t1, t2;
long long dt=0, dtAvg=0, dtMax=0;
double NanoSecMult = 1000000000.0 / ll.QuadPart;
double UsecSecMult = 1000000.0 / ll.QuadPart;

for (int i = 0; i < steps; i++)
{
QueryPerformanceCounter(&t1);
QueryPerformanceCounter(&t2);
dt = t2.QuadPart - t1.QuadPart;
dtAvg += dt;
if (dt>dtMax)
dtMax = dt;
}
double dtd = dtAvg*UsecSecMult / steps;
double dtdMax = dtMax * UsecSecMult;
printf_s("steps: %d, dtAvg: %.12f usec, dtMax: %.6f usec\n", steps, dtd, dtdMax);

输出示例:

... 
steps: 10000000, dtAvg: 0.008456895938 usec, dtMax: 3.893501 usec
steps: 10000000, dtAvg: 0.008427907056 usec, dtMax: 222.991405 usec
steps: 10000000, dtAvg: 0.008488256317 usec, dtMax: 452.353993 usec
steps: 10000000, dtAvg: 0.008457002125 usec, dtMax: 433.594398 usec
steps: 10000000, dtAvg: 0.008493247077 usec, dtMax: 9.910729 usec
steps: 10000000, dtAvg: 0.008432154511 usec, dtMax: 10.618638 usec
steps: 10000000, dtAvg: 0.008588921008 usec, dtMax: 480.670362 usec
...

所以 dtAvg 几乎始终相同,只是最后一位有所不同,但是 dtMax 从 2 usecs 跳到 550 usecs 很多

问题:

  1. 有没有人知道为什么会发生这种情况以及我是否可以消除这些峰值?
  2. 它真的需要这 500 usecs 来调用(此时线程阻塞)还是它只是返回“不正确”的值但不影响线程执行?

谢谢。

最佳答案

据推测,发生的事情是,您偶尔会为进程切换计时——也就是说,您的进程正在运行并从时钟返回连续的值——但在某个时候,进程调度程序会决定一些其他进程应该获得一些 CPU 时间(或者至少调度程序本身会运行以确定其他进程是否应该获得一些 CPU 时间)。

当发生这种情况时,对 QPC 的调用之一将显示比其余大多数调用大得多的增量。

关于c++ QueryPerformanceCounter 性能峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32095855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com