- 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/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!