如何准确测量 C++ 函数使用的时钟周期?

2023-12-24

我知道我必须使用:rdtsc。测量的函数是确定性的,但结果远不能重复(每次运行我得到 5% 的振荡)。 可能的原因有:

  • 上下文切换
  • 缓存未命中

您还知道其他原因吗? 如何消除它们?


TSC(什么rdtsc使用)在多处理器系统上通常不同步。它可能有助于设置 CPU 关联性,以便将进程绑定到单个 CPU。

您还可以从以下位置获取时间戳HPET定时器 http://en.wikipedia.org/wiki/HPET如果可用,则不易出现相同的问题。

至于重复性,这些差异是真实的。您可以禁用缓存,为进程提供实时优先级和/或(如果在 Linux 或类似的系统上)以较低的固定计时器中断频率(执行时间切片的频率)重新编译内核。您无法完全消除差异,至少不容易,而且在常规 CPU + 操作系统组合上更是如此。

一般来说,出于易于编码、可靠性和可移植性的原因,我建议您使用操作系统提供的功能。如果它提供高精度计时器,请使用适当的操作系统助手。

(以防万一您尝试对加密系统进行时间攻击,那么,您将不得不忍受 1. 这种随机性和 2. 出于充分原因使系统不可预测的一般防御,因此该函数可能不会时间上具有确定性。)

编辑:添加了有关操作系统可以提供的计时器的段落。

编辑:这是指Linux。要将进程绑定到单个 CPU(以便从 RDTSC 准确读取),您可以使用sched_setaffinity(2) http://linux.die.net/man/2/sched_setaffinity. And here http://repo.or.cz/w/kmemtrace-user.git?a=blob;f=kmemtraced.c;h=217478ddca954a9d3fc4c4c99bd9f3c93e498bb1;hb=0d00b11cc4badc1da3313fd84335efedde27ad83#l73我的一个项目中的一些代码将其用于其他目的(将线程映射到 CPU)。这应该是您的第一次尝试。对于 HPET,您可以使用常规 POSIX 调用,例如,只要内核和机器支持这些定时器。

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

如何准确测量 C++ 函数使用的时钟周期? 的相关文章

  • 如何知道Matlab中系统命令执行过程中经过的时间?

    我有一个运行系统脚本的 Matlab 代码 该脚本可能会因命令运行而停止 我想知道是否有一种方法可以让程序知道它是否花费了很长时间并执行其他操作 这是代码 tic status cmdout system iperfcmd The prog
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • VBS 与 PowerShell:哪个更轻?

    如果我需要一个可以在系统中以最少的努力执行的脚本 我会选择哪个 通过查看任务管理器中的进程 内存 私有工作集 wscript exe 2 068Kpowershell exe 33 144K Thanks 这里存在工作守恒定律 如果机器做的
  • GWT 在开发模式下运行缓慢

    我在开发模式下使用最新的 GWT 2 0 版本的 Eclipse Galileo 但它运行速度非常慢 我需要等待大约一分钟才能打开一个页面 但编译后 当我使用 Tomcat 5 5 运行它时 我的应用程序运行得很好 我的代码不太重 我猜有一
  • 如何加快 jar 签名者的速度?

    我使用 ant 来签署我的 jars 以进行网络启动部署 Ant signjar 在 Web 启动签名时非常慢 如何加快签名过程 我找到了一种可能的解决方案 早些时候 在构建脚本 ant signjar 中 按顺序调用所有 jar 我们使用
  • MongoDB 的优点和缺点? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 SQL Server 2005/2008 中存储历史数据的最佳方式是什么?

    我的简化和人为的示例如下 假设我想每天测量和存储世界上所有城镇的温度 和其他值 我正在寻找一种存储数据的最佳方法 以便可以轻松获取所有城镇的当前温度 就像获取一个城镇历史上的所有温度一样 这是一个很容易解决的问题 但我正在寻找最好的解决方案
  • 在 Windows 10 家庭版上运行性能配置文件

    我正在尝试在 Windows 10 上运行 IIS Express 的 Visual Studio 2017 探查器 但我遇到了一些麻烦 当我尝试安装所有必需的 IIS 组件时 我注意到我缺少一些组件 因为我运行的是 Windows 10
  • 嵌套 json 到 pandas 非常慢

    我正在尝试转换 321MB将 json 文件嵌套到 pandasDataframe这需要我非常非常很长时间以来 我确信有一种更快的方法可以做到这一点 这是我的代码 数据如下所示 js dict data 0 5 d datetime 201
  • 使用嵌套 if 子句向量化循环

    Problem 我正在尝试优化代码的运行时 并且之前曾提出过类似的问题 其中包括几个嵌套的 if 语句 向量化嵌套 if 语句 https stackoverflow com questions 38125770 vectorizing n
  • BulkRequestBuilder 的 Elasticsearch 索引速度变慢

    大家好 elasticsearch 大师们 我有数百万数据需要由elasticsearch Java API 索引 Elasticsearch 的集群节点数量为 3 个 1 个主节点 2 个节点 我的代码片段如下 Settings sett
  • 为什么未执行的语句会减慢我的函数速度?

    我创建了四个不同的函数 如下所示 var normal function return var control function return alert Hello world var withArguments function ret
  • 当数据大小超过 500 万时,在 mongoDb 中从 java 调用 find() 查询会变慢

    我的应用程序在从 java 的 mongoDb 中执行 find 操作时遇到性能问题 当数据大小超过 500 万时 需要花费大量时间 有时搜索单个文档需要数千毫秒 任何意见都将受到赞赏 java查找查询 db test find flag
  • 控制台应用程序比 GUI 应用程序运行得更快吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我对编程世界比较陌生 我有几个性能问
  • “d = dict()”和“d = {}”之间的区别

    python2 7 m timeit d 10000000 loops best of 3 0 0331 usec per loop python2 7 m timeit d dict 1000000 loops best of 3 0 1
  • Hibernate 对于 Android 应用程序来说是一种杀伤力吗? [复制]

    这个问题在这里已经有答案了 我正在为我的 Android 应用程序寻找一个好的 ORM 乍一看似乎对于移动设备我更喜欢使用更简单的东西 问题是我只是在这里假设 没有真正的证据 所以我想我应该询问社区的意见 也许有人有过这样的经历 它是一个相
  • 在方法之间重用PreparedStatement?

    We all know https stackoverflow com questions 2467125 reusing a preparedstatement multiple times that https stackoverflo
  • Django:将博客条目查看次数增加一。这有效率吗?

    我的索引视图中有以下代码 latest entry list Entry objects filter is published True order by date published 10 for entry in latest ent
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi

随机推荐

  • Vue 中的 TreeView 未正确渲染子文件夹内容

    我正在尝试建立一个TreeView在 Vue 中从头开始 This https codesandbox io s optimistic wilbur 8dreq到目前为止是我的代码 我遇到的第一个问题是子文件夹的内容 例如child fol
  • CakePHP 2.0 账户激活后自动登录

    我正在研究我们新项目的用户管理组件 计划是 用户使用最少量的帐户数据 用户名 密码 电子邮件 在页面上注册 用户收到一封电子邮件 其中包含用于激活帐户的激活链接 用户点击链接并激活他的帐户 系统在激活后自动登录用户 并将其重定向到带有帐户信
  • 如何在页面加载时动态更改aspx页面的标题

    我有一组 ASPX 页面 其中每个页面都有不同的标题 但我想为没有标题的页面设置默认标题 默认标题必须是可配置的 如果这是经典的 ASP NET 不是 MVC 并且您正在使用MasterPage然后你可以设置默认标题Page Load事件在
  • PHP sqlsrv 查询数据库

    我从 MySQL 迁移到 MS SQL Server 并尝试从例程表中获取所有数据 我已连接 但不确定如何使用 sqlsrv 获取数据 这就是我已经走了多远 conn array array UID gt sa PWD gt root Da
  • 在选中列表框中创建选中项目的字符串数组

    如何使用 foreach 循环 或任何其他方式 创建一个包含 checklistbox 中选中项目的数组 我无法知道列表中的项目数量 假设您使用 3 5 或更高版本 object items lb CheckedItems OfType T
  • 凿子3.功能模块Mux4

    我正在按照文档学习 Chisel在 Github 上 https github com ucb bar chisel3 wiki Short 20Users 20Guide 20to 20Chisel 到目前为止 一切都完美无缺 但我还是卡
  • 使用 INSERT 和 AUTO-INCREMENT 列的 SQL 语句中出现错误

    INSERT INTO configuration VALUES News Box Character Count NEWS BOX CHAR COUNT 200 Set the number of characters bytes tha
  • 如何实现制表符补全

    我试图弄清楚如何在 C 应用程序中实现子命令的制表符补全 我希望它的功能与 Git 的制表符补全非常相似 我正在浏览 Git 的源代码 但它并没有引起我的注意 我已经搜索了实现选项卡完成的方法 但没有找到直接的答案 因此我猜测它可能不一定是
  • 如何将hashMap转换为Json文件

    我是偏向Java的 我必须使用 rpc 将 Hashmap 传输到服务器 HashMap Map
  • 在给定 sqlite 进度的情况下,在 Android 中存储图像的规范方法

    我完全清楚 通常不建议将图像作为 blob 存储在数据库中 但我最近遇到this https www sqlite org fasterthanfs html网站记录了 sqlite 在向数据库读取和写入图像 blob 方面的性能提升 简而
  • Android 错误:应用程序意外停止,请重试

    我制作了一个运行良好的应用程序 它显示应用程序已启动的次数 这是代码 import android app Activity import android content SharedPreferences import android o
  • “释放未使用的内核内存”从何而来?

    我经常看到Freeing unused kernel memory xxxK from dmesg 但在 grep rg 的帮助下我永远无法从内核源代码中找到此日志 它从何而来 该行文本不作为单个完整字符串存在 因此您无法对其进行 grep
  • 如何在 Android 的 Volley 中创建一个新的 newRequestQueue

    我有一个片段 我尝试实例化一个新的newRequestQueue使用 Volley API 我尝试像这样实例化它 RequestQueue queue Volley newRequestQueue this 但是 当我尝试创建请求时 出现以
  • 完全删除 Angular4 中的测试

    我使用构建了一个非常小的应用程序angular4 我有一个主应用程序组件 两个子组件和一项服务 我觉得我不需要对这么小的应用程序进行测试 并且想删除与使项目更干净相关的所有测试 所以我的问题是我可以从项目中删除哪些与测试相关的文件 我已经删
  • 选择当前聚焦的元素

    我想在整个文档中找到当前关注的元素 我尝试使用 focusjQuery 1 6 引入的伪类 document find focus But document find focus length总是返回0 您应该能够使用activeEleme
  • 这是矫枉过正,还是对 CakePHP 的 HTML 帮助器的良好利用?

    我刚刚重新格式化了 CakePHP 应用程序的默认布局 我通过将几乎所有内容都放在 html 帮助器方法中来消除尽可能多的内联 html 这很有趣 但我想知道我从这次练习中获得了什么好处 如果有的话
  • 将数组的每个对应元素转换为r中的向量

    我有大量数组 希望将所有这些数组中特定位置的所有元素转换为向量 也就是说 如果我有 2 个数组 如下所示 39 1 2 3 4 5 1 0 00000000 0 00000000 0 0000000 0 000000 0 2 0 06703
  • Ruby Timeout::timeout 不会引发异常,也不会返回记录的内容

    我有这段代码 begin complete results Timeout timeout 4 do results platform search artist album name end rescue Timeout Error pu
  • 如何在Camel路由中使用上下文路径?

    我是骆驼新手 我正在 spring boot 中做一个项目 使用camel作为路由 我注意到 当我去 SwaggerUi 查看 Post 调用的正确功能时 路由的 contextPath 不起作用 public void configure
  • 如何准确测量 C++ 函数使用的时钟周期?

    我知道我必须使用 rdtsc 测量的函数是确定性的 但结果远不能重复 每次运行我得到 5 的振荡 可能的原因有 上下文切换 缓存未命中 您还知道其他原因吗 如何消除它们 TSC 什么rdtsc使用 在多处理器系统上通常不同步 它可能有助于设