Windows 10 下多核处理器上的 QueryPerformanceCounter 行为不稳定

2023-12-19

在 Windows 下,我的应用程序使用QueryPerformanceCounter (and QueryPerformanceFrequency)来执行“高分辨率”时间戳。

自 Windows 10 以来(到目前为止仅在 Intel i7 处理器上进行了测试),我们观察到返回值的不稳定行为QueryPerformanceCounter。 有时,调用返回的值会跳得很远,然后又回到之前的值。 感觉好像线程已经从一个核心移动到另一个核心,并在一段时间内返回了不同的计数器值(没有证据,只是一种直觉)。

在 XP 或 7 下从未观察到过这种情况(没有有关 Vista、8 或 8.1 的数据)。

一个“简单”的解决方法是使用 BCDEdit 启用 UsePlatformClock 启动选项(这使得一切正常运行)。

我知道潜在的优越者GetSystemTimePreciseAsFileTime但由于我们仍然支持 7,所以这不完全是一个选择,除非我们为不同的操作系统编写完全不同的代码,而我们确实不想这样做。

在 Windows 10 下是否观察到/解释了这种行为?


我需要更多关于您的代码的知识,但让我强调一下 MSDN 中的一些内容:

计算增量时,[来自 QueryPerformanceCounter] 的值应该是clamped确保计时值中的任何错误都不会导致崩溃或与时间相关的计算不稳定。

尤其是这个:

使用 Windows API SetThreadAffinityMask 将单个线程设置为保留在单个处理器上...虽然 QueryPerformanceCounter 和 QueryPerformanceFrequency 通常会针对多个处理器进行调整,BIOS 或驱动程序中的错误可能会导致这些例程返回不同的值当线程从一个处理器移动到另一个处理器时。因此,最好将线程保留在单个处理器上。

你的情况might利用其中之一bugs。简而言之:

  • 您应该始终从一个线程查询时间戳(设置相同的 CPU 关联性以确保它不会更改)并从任何其他线程读取该值(只是一种互锁读取,不需要花哨的同步)。
  • 限制计算出的增量(至少确保它不是负数)...

Notes:

QueryPerformanceCounter()如果可能的话,使用 TSC(参见MSDN https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx)。从 Windows 7 到 Windows 8,同步 TSC 的算法(如果可用并且在您的情况下应该如此)发生了很大变化,但请注意:

随着多核/超线程 CPU、具有多个 CPU 的系统和休眠操作系统的出现,不能依赖 TSC 提供准确的结果 — 除非非常小心地纠正可能的缺陷:滴答率以及是否所有内核(处理器)在其计时寄存器中都具有相同的值。不保证单个主板上多个 CPU 的时间戳计数器会同步。所以,程序只有限制自己在一个特定的CPU上运行才能得到可靠的结果.

然后,即使理论上 QPC 是单调的,您也必须始终从同一线程调用它以确保这一点。

另请注意:如果同步是通过软件进行的,您可以从英特尔文档中读到:

...软件可能很难以某种方式做到这一点,而不是确保所有逻辑处理器在给定时间点具有相同的 TSC 值...


Edit:如果您的应用程序是多线程的,并且您不能(或不想)设置 CPU 关联性(特别是如果您需要精确的时间戳,但代价是线程之间的值不同步),那么您可以使用GetSystemTimePreciseAsFileTime()在 Win8(或更高版本)上运行并回退到timeGetTime()对于 Win7(将粒度设置为 1 毫秒后)timeBeginPeriod(1)并假设 1 ms 分辨率就足够了)。非常有趣的读物:Windows 时间戳项目 http://www.windowstimestamp.com/description.

Edit 2: OP直接建议!如果适用(因为它是系统设置,而不是应用程序的本地设置),这可能是一个简单的解决方法。您可以使用 bcdedit 强制 QPC 使用 HPET 而不是 TSC(请参阅MSDN https://msdn.microsoft.com/en-us/library/windows/hardware/ff542202(v=vs.85).aspx)。延迟和分辨率应该更差,但本质上是这样safe从上述问题来看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 10 下多核处理器上的 QueryPerformanceCounter 行为不稳定 的相关文章

  • RMI 有多快?

    我看到过这样的问题 两个独立的 Java 桌面应用程序之间的通信 https stackoverflow com questions 1680898 communication between two separate java deskt
  • robocopy 脚本:系统资源不足

    我有一个之前可以运行的脚本 一个机器人复制脚本 备份服务器坏了 新的服务器丢失了一些配置 但我不是 Windows 用户 脚本如下 C Windows system32 Robocopy F Equipos NASSERVERBACKUP
  • 为什么 pow(int, int) 这么慢?

    我一直在做一些项目欧拉练习来提高我的 C 知识 我写了以下函数 int a 0 b 0 c 0 for a 1 a lt SUMTOTAL a for b a 1 b lt SUMTOTAL a b c SUMTOTAL a b if c
  • 如何加快编辑距离计算速度

    我正在尝试运行模拟来测试平均值编辑距离 http en wikipedia org wiki Levenshtein distance之间随机 二进制字符串 我的程序是用 python 编写的 但我正在使用这个C扩展 https githu
  • 强制窗口在打开时获得焦点

    我有一个 WPF 应用程序 它通过套接字连接与 C MFC 应用程序进行通信 如果用户按下 C 应用程序中的特定按钮 则会显示一个新的 WPF 窗口 以下是调用以启动 WPF 窗口的代码 var window new Window wind
  • C++串口问题

    我在 Visual Studio 上使用 C 连接到任何串行端口 想要与 Arduino 交换 时遇到问题 我正在使用串行类 http www arduino cc playground Interfacing CPPWindows在 Ar
  • Windows下Kafka托管在Docker中删除主题时出现异常

    我在 Windows 的 Docker 中托管 Kafka 威斯迈斯特 卡夫卡 https hub docker com r wurstmeister kafka 使用 docker 镜像 Kafka 数据存储在本地 Windows 文件夹
  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • 从 JavaScript 数组中获取对象值的最大值和最小值

    从 JavaScript 对象数组中获取最大值和最小值的最佳方法是什么 Given var a x 1 y 0 x 1 y 10 x 12 y 20 x 61 y 10 var minX Infinity maxX Infinity for
  • isinstance(foo,types.GeneratorType)还是inspect.isgenerator(foo)?

    Python中似乎有两种方法来测试一个对象是否是生成器 import types isinstance foo types GeneratorType or import inspect inspect isgenerator foo 本着
  • R 脚本自动化时的不同结果

    以下命令对 pdf 文件执行 Ghostscript 这pdf file变量包含该 pdf 的路径 bbox lt system paste C gs gs8 64 bin gswin32c exe sDEVICE bbox dNOPAUS
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • Python 无法在 git bash 命令行中工作

    Python 不会在 git bash Windows 中运行 当我在命令行中输入 python 时 它会将我带到一个空行 而不会像在 Powershell 中一样显示它已输入 python 2 7 10 它没有给我错误消息 但 pytho
  • Windows Workflow Foundation 4 (WF4) 延迟

    我正在与 Visual Studio 2010 的候选版本一起使用 Wf4 编写一个用于批准资源请求的新工作流程 在我的工作流程中 如果请求未获得批准 我希望请求在几天后过期 我们在 WF 3 5 Visual Studio 2008 中通
  • 如何更改选项卡控件的名称

    我在 C WinForms 应用程序中使用选项卡控件 我想更改选项卡的标题 默认情况下它们是 tabPage1 tabPage2 等 一种无需代码即可实现的懒惰方法 选择选项卡控件 Go to properties use F4 to do
  • 为什么 Android Eclipse 不断刷新外部文件夹并花费很长时间?

    我只有一部新的 Android 手机 我一直在修补一些基本的应用程序 每当我保存任何内容时 Eclipse 的 Android 插件就会刷新外部文件夹 这让我抓狂 通常我不会介意 但当需要 10 秒才能刷新时 我开始注意到 我已经搜索过 其
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • 移动/调整窗口大小时闪烁

    我开发了一个显示 jpeg 图像的应用程序 它可以显示 4 个图像 屏幕的每个象限各一个 为此 它使用了 4 个窗口 窗口没有边框 框架 也没有标题栏 当加载新图像时 窗口大小会根据新图像进行调整 然后显示该图像 尤其是当窗户做得较大时 经
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇

随机推荐

  • 避免在继承的 java 类中进行强制转换

    我有一堂课 class MyClass public MyClass getParent public MyClass getChildren 和一个子类 MySubClass extends MyClass public String g
  • android 动态改变样式

    我已经在 styles xml 中描述了对象的属性 不管对象是什么 我想在 styles xml 中动态更改这些属性 有人知道我该怎么做吗 你可以这样做 活动中 this setTheme R style ThemeRed 在 styles
  • 如何在由knitr制作的HTML5幻灯片中使用“R生成”图作为半透明背景?

    我想在 HTML5 幻灯片的第一页添加一个绘图 我可以以动态的方式实现这一点吗 也就是说 背景图像将由 R 代码生成 而不是插入半透明的 PNG 图像 谢谢 Update 我想要的是 您可以使用块选项dev args为了达成这个 您需要正确
  • 什么是语句的不可达端点(unreachable endpoint)?

    受到这个问题的回答的启发 C 中 switch 的空情况是否与下一个非空情况合并 https stackoverflow com questions 15164318 is empty case of switch in c sharp c
  • 使用 wincertstore 的 Python 请求

    我试图通过 requests 包连接到我公司的内部网页 但由于 python 不使用 Windows 默认的受信任证书 因此连接被拒绝 我发现 wincertstore 可用于获取 Windows 默认证书 但我仍然不确定如何将其与我的请求
  • .NET / WPF 中的通用 JSON 解析器?

    我读过很多关于如何使用 DataContractJsonSerializer 将 JSON 对象反序列化为特定对象的教程 但是 我想将我的对象反序列化为由字符串 数组或字典组成的字典 例如当我说 JsonObject Parse myJSO
  • 在Python中分割字符串

    我有一个像这样的字符串 这是 括号测试 和引号测试 我正在尝试用 Python 编写一些内容 将其按空格分开 同时忽略方括号和引号内的空格 我正在寻找的结果是 this is 括号测试 和引号测试 这是一个适用于您的测试输入的简单解决方案
  • 如何在数据库中存储自定义用户字段

    我正在尝试找到一个教程来指导我基于用户的自定义字段如何工作 就像在调查网站中一样 它们允许用户创建自定义字段并存储它们 更重要的是存储通过这些字段输入的数据 我正在寻找一些描述如何在数据库上完成此操作的内容 我在寻找一种方法时遇到了一些麻烦
  • fwrite 对于大量小写入的效率

    我有一个程序可以使用以下命令保存许多 gt 1GB的大文件fwrite它工作得很好 但不幸的是由于每次调用的数据的性质fwrite只写1 4字节 结果 写入可能需要一个多小时 其中大部分时间似乎是由于系统调用开销 或至少在 fwrite 的
  • TextView 椭圆高度明智

    有没有等价的android ellipsize 对于 y 轴上太长的文本 省略 x 轴上太长的文本 我有一个 TextView 它必须是固定高度 但是它里面的文本通常太长 无法全部容纳 我希望它在被切成两半之前停止 我不想设置android
  • Android SearchRecentSuggestions - 在 SearchView 中输入时不会显示建议

    我有一个可用的搜索小部件 并且想要添加搜索历史记录建议 我按照 Android 教程 http developer android com guide topics search adding recent query suggestion
  • 如何为 VSTS 添加 GIT 子模块以与 Visual Studio 2017 一起使用

    如何在 Azure GIT 中创建子模块存储库和我的另一个项目 C MVC 并在 Azure GIT 中使用它或在 Visual Studio 2017 IDE 中引用它 是否有任何视频显示此内容或解释此内容的文档 我没有看到任何东西 尤其
  • 使用factomineR 进行因子分析

    当我在 R 中使用函数 CA 时遇到问题 我的数据是 data row names Conscient NonConscient MoinsSouvent 185 213 PlusieursfMois 98 56 PlusieursfSem
  • “此 HTML5 文档检查接口已弃用”

    在做一个项目时 我正在检查它是否有 W3C 错误 使用HTML 验证器 https addons mozilla org en us firefox addon html validator Firefox 的插件 在此过程中我发现了一个以
  • Java-多边形和线的交点

    有没有什么函数可以给我一个交点Polygon and Line2D 我有一个多边形和一个我知道相交的线段 我想要交点的实际值而不是布尔答案 给你 有趣的方法是 getIntersections 和 getIntersection 前者解析所
  • EF core 5 多对多过滤器

    这是我的查询 public async Task
  • 量角器无法单击 元素内嵌入的

    我有两个嵌入式 span 里面的元素 a 元素 我需要在第二个触发点击事件 span The by id方法上的id我创建的类没有触发点击 我也尝试过by binding但这不起作用 请帮助 代码 div class add player
  • 使用 JavaScript 添加微数据

    我有一个基于 Javascript 和 php 的评级系统 每个页面上都会显示结果 X 票 moyenne X X 是数字 moyenne 表示 平均符号 我想要 javascript 添加微数据信息 源代码应该显示如下内容 span X
  • python 仅使用 urllib2 获取标头

    我必须使用 urllib2 实现一个仅获取标头的函数 不执行 GET 或 POST 这是我的功能 def getheadersonly url redirections True if not redirections class MyHT
  • Windows 10 下多核处理器上的 QueryPerformanceCounter 行为不稳定

    在 Windows 下 我的应用程序使用QueryPerformanceCounter and QueryPerformanceFrequency 来执行 高分辨率 时间戳 自 Windows 10 以来 到目前为止仅在 Intel i7