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 行为不稳定 的相关文章

  • 可以读取目标文件吗?

    我很好奇 obj文件 我几乎不知道它们是什么 或者它们包含什么 所以我用 Vim 文本编辑器打开它们 我在里面发现了一种类似外星人的语言 有什么办法可以理解它们代表什么以及它们的内容是什么 另外 它们的用途是什么 Thanks Sure 但
  • 仅在单个端口 8080 上转发到本地主机(Windows)可能吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我知道如何在 Windows 上使用 xampp 设置本地网络服务器 我在主机文件 c windows system32 drivers etc ho
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • Windows 窗体中的标准 Windows 菜单栏

    我注意到添加了一个MenuStrip 来自工具箱 我的表单设计不会产生像许多本机 Windows 应用程序中那样的菜单栏 相反 我得到了一个像 Visual Studio 自己的菜单栏 没有任何样式设置MenuStrip似乎模仿了更常见的本
  • Windows 上的 ffmpeg-android ndk

    我正在尝试编译 bash 文件 带有 android ndk 的 ffmpeg 我收到如下错误 arm linux androideabi gcc 无法创建可执行文件 C 编译器测试失败 Makefile 2 config mak 没有这样
  • 如何提高包含大量小图像的 UCollectionView 的性能?

    在我的 iOS 应用程序中我有UICollectionView显示大约 1200 个小 35x35 点 图像 图像存储在应用程序包中 我正确地重用了UICollectionViewCell但仍然存在性能问题 具体取决于我处理图像加载的方式
  • java定时器任务调度

    通过阅读 Stack Overflow 我发现很多人不建议使用 Timer Task 嗯 但我已经实现了这个 我有这个代码 detectionHandlerTimer schedule myTimerTask 60 1000 60 1000
  • 什么是浮点推测以及它与编译器的浮点模型有何不同

    英特尔 C 编译器提供两个控制浮点的选项 fp 推测 快速 安全 严格 关闭 fp model 精确 快速 严格和源 双 扩展 我想我明白 fp model 的作用 但什么是 fp 推测以及它与 fp 模型有何关系 我还没有找到任何解释这一
  • Windows 上的 Apache Pig 在运行“pig -x local”时出现“hadoop-config.cmd”未被识别为内部或外部命令”错误

    如果您由于以下错误而无法在 Windows 上运行 Apache Pig hadoop 2 4 0 bin hadoop config cmd is not recognized as an internal or external com
  • Swift 使用哪种通用排序算法?它在排序数据上表现不佳

    我一直在挑选和探索 Swift 标准库sort 其函数为Array类型 令我惊讶的是 我注意到它在已经排序的数据上表现不佳 对数组进行排序Int打乱顺序似乎比对已经排序的同一个数组进行排序快 5 倍 对已打乱顺序的对象数组进行排序比对已按排
  • 通过 PowerShell 运行 .cmd 文件

    我正在尝试使用 PowerShell 在远程服务器上运行 cmd 文件 在我的 ps1 脚本中我尝试过 C MyDirectory MyCommand cmd 它会导致此错误 C MyDirectory MyCommand cmd is n
  • 有没有更简单的方法来处理复选框?

    在 vb net 中 我有一个包含一组四个复选框的表单 每个复选框都表示 选中时 用户想要向其订单添加特殊指令 代码如下所示 If SpecialInstruction1CheckBox Checked Then AddSpecialIns
  • 更改当前工作目录 VS13?

    如本文所述post https stackoverflow com questions 11979632 c sdl why does sdl loadbmp return null我调试 SDL 程序时的工作目录是相对于 vcproj 而
  • 为什么同样的算法在 Scala 中运行比在 C# 中慢得多?以及如何让它更快?

    该算法根据序列中每个成员的变体创建序列的所有可能变体 C 代码 static void Main string args var arg new List
  • TypeScript 编译速度极慢 > 12 秒

    只是把它放在那里看看其他人是否也遇到这个问题 我已经使用 webpack 作为我的构建工具 使用 typescript 构建了一个 Angular 2 应用程序 一切都运行良好 但是我注意到 typescript 编译超级超级慢 我现在只有
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v

随机推荐

  • 避免在继承的 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