测量执行单个指令的时间

2023-12-05

有没有办法使用 C 或汇编程序甚至 C# 来准确测量执行 ADD 指令所需的时间?


是的,有点,但它并不平凡,并且产生的结果是almost毫无意义,至少在最现代的处理器上是这样。

在相对较慢的处理器上(例如,从英特尔系列中的原始奔腾处理器开始,在大多数小型嵌入式处理器上仍然如此),您只需查看处理器的数据表,它(通常)会告诉您期望的时钟滴答数。快速、简单、容易。

在现代台式机(例如 Pentium Pro 或更新版本)上,生活并不nearly就这么简单。这些 CPU 可以一次执行多条指令,并且只要它们之间不存在任何依赖关系,就可以乱序执行它们。这意味着单个指令所花费的时间的整个概念变得几乎毫无意义。执行一条指令所花费的时间可以并且将取决于它周围的指令。

也就是说,是的,如果你真的想要,你可以(通常 - 取决于处理器)测量一些东西,尽管它到底意味着什么仍然存在相当大的问题。即使得到这样的结果也只是close to无意义而不是完全无意义并不是微不足道的。例如,在 Intel 或 AMD 芯片上,您可以使用 RDTSC 本身进行时序测量。不幸的是,如上所述,这可能会乱序执行。为了获得有意义的结果,您需要用一条不能乱序执行的指令(“序列化指令”)包围它。最常见的选择是CPUID,因为它是可用于“用户模式”(即环 3)程序的少数序列化指令之一。不过,这本身就增加了一些扭曲:根据英特尔的记录,处理器执行 CPUID 的前几次可能比后续时间花费更长的时间。因此,他们建议您执行它three在你使用它来序列化你的计时之前。因此,一般顺序是这样的:

.align 16
CPUID
CPUID
CPUID
RDTSC
; sequence under test
Add eax, ebx
; end of sequence under test
CPUID
RDTSC

然后,将其与执行相同操作但删除了测试序列的结果进行比较。当然,这遗漏了相当多的细节——至少你需要:

  1. 在每个CPUID之前正确设置寄存器
  2. 在第一个 RDTSC 之后将值保存在 EAX:EDX 中
  3. 从第一个 RDTSC 中减去第二个 RDTSC 的结果

另请注意我插入的“align”指令——指令对齐也会影响时序,特别是在涉及循环的情况下。

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

测量执行单个指令的时间 的相关文章

  • C++ 中跨多个文件的类

    我几乎 100 确定我在这两个类中的语法都是正确的 但是我收到以下错误 对于 CShape cpp 错误 C2011 CShape class 类型重新定义 对于 CCircle cpp 错误 CS2504 CShape 基类未定义 这是
  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • 从 GetLastError() 函数返回的错误代码中获取文本

    我需要获取从 GetLastError 函数获得的错误代码的文本 我看到了一些示例 但我想要一个获取代码并返回字符串的函数 谢谢大家 我猜你想要这样的东西 DWORD dwLastError GetLastError TCHAR lpBuf
  • 使用 stringstreams 将字符串转换为 __uint128_t

    我正在尝试从字符串中提取不同类型的数据 void readHeader char buf BUFFSIZE std istringstream hdr buf uint128 t id client hdr gt gt id client
  • 将一个文件写入.c中的另一个文件

    我有一个读取文件然后将其内容复制到另一个文件的代码 我需要使其仅复制每 20 个符号 然后跳过 10 个符号 然后再次跳过 20 个符号 依此类推 我必须使用 lseek 函数 但我不知道如何将所有这些放入循环中来执行此操作 main ar
  • 如何混淆整数?

    我需要从 C 中的整数列表生成唯一值的列表 我以为是 MD5 或类似的 但它们生成了太多字节 整数大小为 2 个字节 例如 我想获得单向通信 0 gt ARY812Q3 1 gt S6321Q66 2 gt 13TZ79K2 因此 在证明哈
  • 如何在 TargetFrameworks 标记中每个框架运行一次的目标之前创建仅运行一次而不是一次的 MSBuild 目标?

    我有一个我部分拥有的代码生成器工具 现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架 我试图弄清楚如何使 MSBuild 目标仅在每个目标中生成一次代码无论列出了多少个目标框架 都将运行构建 并让每个目标框架的编译等待代
  • 运行时动态转换

    有没有一种方法可以在运行时动态转换 如以下伪代码 foreach DataRow row in table Rows foreach DataColumn col in table Columns if row col DBNull Val
  • 时间:2019-03-17 标签:c++rapidjson返回值

    我在我的项目中使用rapidjson 我有一个方法可以解析 json 并返回其中的一部分 static rapidjson Document getStructureInfo std string structureType rapidjs
  • Windows 10 ScrollIntoView() 不会滚动到列表视图中间的项目

    我有一个包含 20 个项目的列表视图 我想以编程方式滚动列表视图 ListView ScrollIntoView ListView Items 0 将滚动列表视图到第一项 ListView ScrollIntoView ListView I
  • Fluent NHibernate 一对一映射

    我很难利用 Fluent NHibernate 的 HasOne 映射 基本上 A 类在 B 类中可以有匹配的 只有一条或没有 记录 请帮助定义关系的 AMap 和 BMap 类 谢谢 public class A public virtu
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • ThemeInfo 属性有什么用?

    每当我创建新的 WPF 应用程序或 WPF 用户控件库时 AssemblyInfo cs文件包含以下属性 assembly ThemeInfo ResourceDictionaryLocation None where theme spec
  • 函数的动态返回类型

    如何创建一个具有基于参数类型的动态返回类型的函数 Like protected DynamicType Test DynamicType type return 为此 您必须使用泛型 例如 protected T Test
  • 使用资源文件进行本地化不起作用

    我添加了新的 Rosource 文件 UserNotification resx 然后我添加了两个文件进行本地化 并将其命名为 UserNotification hr HR resx 和 UserNotification sl SI res
  • 升压参数库

    最近我发现参数 http www boost org doc libs 1 50 0 libs parameter doc html index htmlBoost 中的库 老实说 我不明白为什么这是 Boost 的一部分 当需要向函数传递
  • 警告 C4172:返回局部变量或临时变量的地址[重复]

    这个问题在这里已经有答案了 可能的重复 指向局部变量的指针 https stackoverflow com questions 4570366 pointer to local variable 我在这个网站上阅读了很多关于同一问题的其他主
  • K&R 之后用什么书来学习纯 C 编程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将谓词作为参数传递#

    如何将谓词传递到方法中 但在没有传递谓词的情况下仍使其工作 我想也许是这样的 但似乎并不正确 private bool NoFilter return true private List

随机推荐

  • Rails Paperclip 只能用于图像吗?

    是否有任何 Rails 库用于管理与 ActiveRecord 连接的文件附件 I know 回形针 但它似乎主要适合图像 他们确实提到了音频和 pdf 文件github项目页面 但没有进一步解释不同文件类型的用法 属性如 style如果您
  • ARM直接内存操作

    ARM中有支持直接内存操作的指令吗 所以而不是 cc cc 100 mov r3 0 ldr r1 r3 0 add r1 r1 100 str r1 r3 0 它是否有类似或接近的东西 add r3 0 100 I know this i
  • MongoEngine 指定查询的读取首选项

    我正在使用 Mongo 2 6 Pymongo 2 7 2 和 Mongoengine 0 8 7 对于特定的读取查询 我想使用副本集的辅助副本 因此 正如 mongoengine 文档中所指定的here我的查询如下 from pymong
  • JVM 如何执行 Try catch finally 块

    根据 Java 语言规范 第 14 20 2 节 带有finally 块的try 语句首先执行try 块 然后就有一个选择 If execution of the try block completes normally then the
  • 根据国家/地区获取货币符号

    我有一个显示货币的 TextView 默认情况下 我的文本视图的文本是 0 00我怎样才能做到这样 根据用户选择而变化 我有以下代码 Locale locale new Locale en US Currency currency Curr
  • 类是结构体还是结构体指针

    如果我没记错的话 结构意味着对象 结构指针意味着指向对象的指针 对吗 在一篇文章中 它说类是结构 这意味着它们是对象 Filter the list of all classes The traditional definition of
  • 从 Facebook 获取电子邮件 - FB android SDK

    我使用以下代码从 Facebook 获取用户的电子邮件和姓名 protected void onCreate Bundle savedInstanceState Display page setContentView R layout ac
  • 致命错误:sys/socket.h:32位上没有这样的文件或目录

    当使用 32 位编译我的程序时 gcc m32 program c o program 我收到以下错误致命错误 sys socket h 没有这样的文件或目录 但与 gcc program c o program 效果很好 有什么解决方法吗
  • KSoap2 和 KvmSerialized - 如何发送复杂的对象,如 Stringarrays

    我想将一个复杂的对象从我的 Ksoap 客户端发送到我的 Web 服务 它是我的类别类别的一个对象 该代码基于本教程的示例 http seesharpgears blogspot de 2010 10 ksoap android web s
  • 如何在Hive中获取数组中的前n个元素

    我使用 split 函数在 Hive 中创建一个数组 如何从数组中获取前 n 个元素 并且我想遍历子数组 代码示例 select col1 from table where split col2 0 5 0 5 看起来像 python 风格
  • 如何找到符号的完全限定名称空间?

    如果我有一个符号 其名称空间是别名 例如 q w 我如何找到它的实际名称空间 例如actual namespace w 我知道resolve会给我完全限定的 var 但我不知道如何获取 var 的命名空间 我能做的最好的事情就是 defn
  • MATLAB 中的矩阵运算

    我正在尝试简化我的代码 但遇到了一个小问题 让 v 1 2 3 a1 4 5 6 a2 7 8 9 A a1 a2 我的目标是计算 u v a1 v a2 仅使用v一度 这可能吗 是的 你可以使用bsxfun 例如 u bsxfun tim
  • `use std::io::Result as IOResult;` 比 `use std::io;` 仅仅引用 Rust 中的 `io::Result` 更高效吗?

    在学习 Rust 的过程中 我看到了人们导入库的多种方式 例如std io Result 例如 use std io Result as IOResult and pub type IOResult
  • R 中的表情符号 [UTF-8 编码]

    我正在尝试对 R 进行表情符号分析 我存储了一些带有表情符号的推文 这是我要分析的推文之一 gt tweetn2 1 Programme du week end xed xa0 xbd xed xb2 x83 xed xa0 xbc xed
  • Rails 迁移抱怨使用回形针的未定义方法“附件”

    Lemmie 在开头说我对 Rails 还很陌生 我们的应用程序使用回形针 3 2 4 来管理附件 像往常一样 我生成了一个类似于以下内容的迁移 class AddAttachmentPhotoToPhpfoxUsers lt Active
  • 是否有必要在 C# 中显式删除事件处理程序

    我有一堂课提供一些活动 该类是全局声明的 但不是在该全局声明上实例化的 它是根据需要在需要它的方法中实例化的 每次方法中需要该类时 都会对其进行实例化并注册事件处理程序 在方法超出范围之前是否有必要显式删除事件处理程序 当方法超出范围时 类
  • 为 Windows 上的 Lua 构建 lua 文件系统

    我对构建 makefile 没有任何线索 我正在尝试在 Windows 7 x86 中构建 luafilesystem 以便与 Lua for Windows 一起使用 我已经在互联网上搜索了教程 但我就是无法弄清楚 我在开发人员命令提示符
  • 如何使用 UIImagePickerController 显示所有相机控件?

    使用 UIImagePickerController 时 我无法显示相机控件 具体来说 我需要能够在慢动作 视频 照片 方形和全景之间进行选择 我使用的代码的基本部分是 UIImagePickerController pc UIImageP
  • 从 C# 修改任何窗口的不透明度

    是否可以从 C 修改所有打开的窗口的不透明度 我在 google 上搜索了最小化窗口 我发现这可以通过 pInvoke 调用实现 它甚至起作用了 同样 是否可以从 C 更改所有打开的窗口的不透明度 另外 我不喜欢 MFC 的东西 还有什么工
  • 测量执行单个指令的时间

    有没有办法使用 C 或汇编程序甚至 C 来准确测量执行 ADD 指令所需的时间 是的 有点 但它并不平凡 并且产生的结果是almost毫无意义 至少在最现代的处理器上是这样 在相对较慢的处理器上 例如 从英特尔系列中的原始奔腾处理器开始 在