gpt4 book ai didi

c++ - 为什么 Sleep() 会使后续代码减慢 40 毫秒?

转载 作者:可可西里 更新时间:2023-11-01 13:28:07 27 4
gpt4 key购买 nike

我最初是在 coderanch.com 上询问过这个问题的,所以如果你试图在那里帮助我,谢谢,并且不要觉得有必要重复这项工作。不过,coderanch.com 主要是一个 Java 社区,这似乎(经过一些研究)确实是一个 Windows 问题,所以我和那里的同事认为这可能是寻求帮助的更合适的地方。

我编写了一个简短的程序,它要么在 Windows 性能计数器上旋转直到 33 毫秒过去,要么调用 Sleep(33)。前者没有表现出意想不到的效果,但后者似乎(不一致地)将后续处理减慢了大约 40 毫秒(要么是这样,要么是对从性能计数器返回的值有一定影响)。自旋或 Sleep() 之后,程序调用例程 runInPlace(),自旋 2 毫秒,计算它查询性能计数器的次数,并返回该数字。

当通过旋转完成最初的 33 毫秒延迟时,runInPlace() 的迭代次数往往是(在我的 Windows 10,XPS-8700 上)大约 250,000。它会有所不同,可能是由于其他系统开销,但它会在 250,000 左右平滑变化。

现在,当通过调用 Sleep() 完成初始延迟时,会发生一些奇怪的事情。许多对 runInPlace() 的调用返回一个接近 250,000 的数字,但其中相当一部分返回一个接近 50,000 的数字。同样,范围在 50,000 左右变化,相当平稳。但是,它显然是平均其中之一,在 80,000 到 150,000 之间几乎没有任何返回。如果我在每次延迟后调用 runInPlace() 100 次,而不是只调用一次,则在第 20 次调用后,它永远不会返回较小范围内的迭代次数。由于 runInPlace() 运行 2 毫秒,这意味着我观察到的行为在 40 毫秒后消失。如果我让 runInPlace() 运行 4 毫秒而不是 2 毫秒,它不会在第 10 次调用后返回较小范围内的迭代次数,因此,同样,该行为在 40 毫秒后消失(同样,如果 runInPlace() 仅运行 1 毫秒;该行为在第 40 次调用后消失)。

这是我的代码:

#include "stdafx.h"
#include "Windows.h"

int runInPlace(int msDelay)
{
LARGE_INTEGER t0, t1;
int n = 0;

QueryPerformanceCounter(&t0);

do
{
QueryPerformanceCounter(&t1);
n++;
} while (t1.QuadPart - t0.QuadPart < msDelay);

return n;
}

int _tmain(int argc, _TCHAR* argv[])
{
LARGE_INTEGER t0, t1;
LARGE_INTEGER frequency;
int n;

QueryPerformanceFrequency(&frequency);

int msDelay = 2 * frequency.QuadPart / 1000;

int spinDelay = 33 * frequency.QuadPart / 1000;

for (int i = 0; i < 100; i++)
{
if (argc > 1)
Sleep(33);
else
{
QueryPerformanceCounter(&t0);

do
{
QueryPerformanceCounter(&t1);
} while (t1.QuadPart - t0.QuadPart < spinDelay);
}

n = runInPlace(msDelay);
printf("%d \n", n);
}

getchar();

return 0;
}

这是我在使用 Sleep() 进行延迟时得到的一些典型输出:

561162489365365934311233488549214790445765314545563355870556073236321981021140021635827403924463515228215177943057374422516585381356237259858252275251099

这是我在旋转以创建延迟时得到的一些典型输出:

276461280869276215280850188066280666281139280904277886279250244671240599279697280844159246271938263632260892238902255570265652274005273604150640279153281146280845248277

谁能帮我理解这种行为? (注意,我已经在五台计算机上尝试过这个用 Visual C++ 2010 Express 编译的程序。它只在我拥有的两台最快的机器上显示了这种行为。)

最佳答案

这听起来像是由于计算机不忙时 CPU 运行的时钟速度降低 (SpeedStep)。当计算机空闲时(如 sleep ),时钟速度会降低以降低功耗。在较新的 CPU 上,这可能是所列时钟速度的 35% 或更少。一旦计算机再次忙碌,在 CPU 再次加速之前会有一小段延迟。

您可以关闭此功能(在 BIOS 中或通过将电源计划高级设置中“处理器电源管理”下的“最低处理器状态”设置更改为 100%。

关于c++ - 为什么 Sleep() 会使后续代码减慢 40 毫秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677079/

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