- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
让我们有以下一段代码,它简单地测量以 20 毫秒调用的 std::this_thread::sleep_for
的持续时间:
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
int main()
{
for (int i = 0; i < 20; i++)
{
auto start = steady_clock::now();
this_thread::sleep_for(milliseconds(20));
auto end = steady_clock::now();
duration<double, milli> elapsed = end - start;
cout << "Waited " << elapsed.count() << " ms\n";
}
}
当使用工具集 v120(VS2013)编译运行时,我得到了预期的结果,即:
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
但是当使用 VS2015 的工具集 v140 运行时,结果有些令人惊讶并且不尊重 msdn 的 promise 和 cppreference.com sleep_for
描述(sleep_for
阻止当前线程的执行至少指定的sleep_duration
)。它们如下:
Waited 19.7793 ms
Waited 19.9415 ms
Waited 19.6056 ms
Waited 19.9687 ms
Waited 19.608 ms
Waited 19.589 ms
Waited 20.5435 ms
Waited 19.5669 ms
Waited 19.6802 ms
Waited 19.5381 ms
这怎么可能,我怎样才能使 VS2015 的 sleep_for
至少按预期休眠?
问候,大卫
编辑:
根据要求,这些是我的设置和操作系统详细信息:
操作系统:
Windows 7 专业版 64 位
Visual Studios:2010 Ultimate、2013 Community、2015 Professional with Update 1
编译器设置:
Win32 控制台应用程序的默认设置,
任何调试和发布配置,
任何 x86 和 x64 目标平台架构
最佳答案
VS2015 中的sleep_for()
方法实现已经包含围绕Sleep()
的循环系统调用,因此任何虚假唤醒都不会影响它 - 请参阅 VC\crt\src\STL\cthread.c
中的 _Thrd_sleep()
。
问题的原因很可能是 sleep_for()
和它在内部调用的 sleep_until()
正在使用 chrono::system_clock
来计算等待时间,但您正在使用 chrono::steady_clock
测量周期。
两个计时器可能具有相同的精度,但不一定具有相同的准确度。然后可能会发生 system_clock
滞后一点,而 steady_clock
已经提前了几微秒,并且使用 system_clock
计算的等待是实际上比要求的要短。
在这种情况下,steady_clock
是使用 QueryPerformanceCounter()
实现的(请参阅 VC\include\chrono
,搜索 struct steady_clock
),因此它将非常准确和精确,因为这是用于精确时间测量的首选 Windows API。
system_clock
是使用 GetSystemTimePreciseAsFileTime()
实现的(参见 VC\include\chrono
,搜索 struct system_clock
),它还 promise “最高可能的精度级别 (<1us)” . las,正如 MSDN 页面所说,此 API 仅在 Windows 8 及以上版本中受支持,您只能使用较旧的 GetSystemTimeAsFileTime()
。在您的 Windows 7 机器上只有 ms 精度。这很可能是您测量错误的结果。
根据您的具体用例,您当然可以用不同的方式处理这个问题。我会考虑忽略这个小错误,因为挂起线程并等待调度程序唤醒它无论如何都不是很准确。
关于c++ - std::this_thread::sleep_for sleep 时间比 VS2015 中的预期短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35741656/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!