- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我最初是在 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/
@ 。 目录 集成Flink 编程示例 打包运行 CDC入湖 概述
当我通过多个模式匹配发送一个变量时,这样做的命名约定是什么? val somethingBetweenOriginalAndResult = original match { case ...
this post 的后续工作:(根据评论中的要求进行更新) 我从实际(伪装的)示例数据以及在该数据上运行脚本的结果开始。 原始数据样本: 目录中前两个文件的标题和前两行。它们是相同的数据,这不是错误
当我通过多个模式匹配发送一个变量时,这样做的命名约定是什么? val somethingBetweenOriginalAndResult = original match { case ...
this post 的后续工作:(根据评论中的要求进行更新) 我从实际(伪装的)示例数据以及在该数据上运行脚本的结果开始。 原始数据样本: 目录中前两个文件的标题和前两行。它们是相同的数据,这不是错误
我just asked a very similar question here两个答案都有效。但是,当我在每个字典中有 > 2 个字典键时,第 3 个键的值始终为 0。例如: myList = [{
此问题是 Trapping Frame Entrance in tkinter 的后续问题其中@jasonharper 提供了非常有用的答案。 在下面的代码中,我将入口绑定(bind)到 Canvas
使用 subsequent from 子句和query continuation 有什么区别? 后面的 from 子句是指使用 ...from...in...from...in...select 模式
我的原题可以查到here ,为此我得到了一些很好的答案、idas 和提示。 作为可行性和性能研究的一部分,我已经开始转换我的模式,以便使用这些想法对我的数据进行版本控制。在这样做的过程中,我想出了一些
圆 A 沿 x 轴向右移动。圆 B 沿 y 轴向上移动。我想知道他们是否会发生碰撞。 (不是何时,只是如果。) 半径相同,恒速度不同。 This answer似乎解决了这个问题,我的问题最好应该是这个
在需要定期轮询服务器的 AJAX 应用程序(如聊天应用程序)中,建议两次调用之间的最短时间是多少,以便尽快完成更新?什么时间被认为是服务器和客户端的 hogs? 最佳答案 这个问题的答案很大程度上取决
这是 a previous question on Stack Overflow 的后续行动(参见引用链接)。考虑以下代码(来自 W3Schools): /* unvisited link */ a:
昨天,我问了a question关于如何在 .NET 中动态呈现某些内容:具体来说,我询问了如何创建用于“绘图”/渲染的白色“ Canvas ”,使用什么框架等。但是,许多答案建议我问更具体的答案,所
这是上一个问题的后续: Java compiler fails to recognise static inner class accepted answer给出了一个解决方法,如果找不到更好的解决方
这个问题跟在问题之后:How to read two lines from a file and create dynamics keys in a for-loop? 但是,问题的性质已经发展到我想
好的跟进 this thread ,这就是我想出的…… public class SharweAuthorizeAttribute : AuthorizeAttribute { private
Using nested loops 我仍在努力实现上述问题中所述的相同目标。基本上我的代码现在看起来像这样: for(int ac = 0; ac < gravityObject.length; a
一直在寻找这个没有结果。我有一个片段,我想将文本文件读入 python 中的变量中,以便稍后可以引用它(特别是杀死正在运行的进程)。 文件生成如下: os.system('wmic process w
我创建了 2 个自定义跟进 Intent ,对于这 2 个自定义跟进 Intent ,还有 3 个跟进 Intent 。一切安好。我从这 2 个阶段获取信息,然后显示结果。该过程大约是 2 个后续问题
这个问题在这里已经有了答案: Iterate through parameters skipping the first (5 个答案) 关闭 5 年前。 我有一个脚本,它的第一个参数是一个对象的标
我是一名优秀的程序员,十分优秀!