rdtsc,循环次数过多

2023-11-28

#include <stdio.h>
static inline unsigned long long tick() 
{
        unsigned long long d;
        __asm__ __volatile__ ("rdtsc" : "=A" (d) );
        return d;
}

int main()
{
        long long res;
        res=tick();

        res=tick()-res;
        printf("%d",res);
        return 0;
}

我已经使用 gcc 和 -O0 -O1 -O2 -O3 优化编译了这段代码。我总是得到 2000-2500 次循环。谁能解释一下这个输出的原因吗?如何度过这些周期?

第一个函数“tick”是错误的。这是正确的

函数“tick”的另一个版本

static __inline__ unsigned long long tick()
{
  unsigned hi, lo;
  __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
  return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}

这是 -O3 的汇编代码

 .file  "rdtsc.c"
.section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "%d"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    subl    $40, %esp
    movl    %ecx, -16(%ebp)
    movl    %ebx, -12(%ebp)
    movl    %esi, -8(%ebp)
    movl    %edi, -4(%ebp)
#APP
# 6 "rdtsc.c" 1
    rdtsc
# 0 "" 2
#NO_APP
    movl    %edx, %edi
    movl    %eax, %esi
#APP
# 6 "rdtsc.c" 1
    rdtsc
# 0 "" 2
#NO_APP
    movl    %eax, %ecx
    movl    %edx, %ebx
    subl    %esi, %ecx
    sbbl    %edi, %ebx
    movl    %ecx, 4(%esp)
    movl    %ebx, 8(%esp)
    movl    $.LC0, (%esp)
    call    printf
    movl    -16(%ebp), %ecx
    xorl    %eax, %eax
    movl    -12(%ebp), %ebx
    movl    -8(%ebp), %esi
    movl    -4(%ebp), %edi
    movl    %ebp, %esp
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
    .size   main, .-main
    .ident  "GCC: (Debian 4.3.2-1.1) 4.3.2"
    .section    .note.GNU-stack,"",@progbits

这是CPU

processor   : 0
vendor_id   : GenuineIntel
cpu family  : 15
model       : 4
model name  : Intel(R) Xeon(TM) CPU 3.00GHz
stepping    : 3
cpu MHz     : 3000.105
cache size  : 2048 KB
fdiv_bug    : no
hlt_bug     : no
f00f_bug    : no
coma_bug    : no
fpu     : yes
fpu_exception   : yes
cpuid level : 5
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss constant_tsc up pebs bts pni
bogomips    : 6036.62
clflush size    : 64

我已经在不同 Intel CPU 上运行的几个 Linux 发行版上尝试过您的代码(诚然,所有这些都比您似乎使用的 Pentium 4 HT 630 更新)。在所有这些测试中,我得到的值在 25 到 50 个周期之间。

我唯一与所有证据一致的假设是,您在虚拟机内而不是裸机上运行操作系统,并且 TSC 正在虚拟化。

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

rdtsc,循环次数过多 的相关文章

  • 在c++中定义一堆静态方法

    哪个是合适的 class xyz static int xyzOp1 static int xyzOp2 OR namespace xyz static int xyzOp1 static int xyzOp2 当我们使用类标签与命名空间标
  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • 集群():是否可以仅检查文件是否已锁定,而不实际获取锁定(如果没有)?

    我的用例如下 我有一个程序 它强制在任何给定时间只能运行它的一个实例 因此在启动时它总是尝试在标准位置获取锁定文件 并在该文件终止时终止已经被锁定 这一切都工作正常 但现在我想用一个新的命令行选项来增强程序 当指定该选项时 将导致程序只打印
  • std::map find 在 C++ 中不起作用[重复]

    这个问题在这里已经有答案了 我使用以下几行创建了一个哈希映射和一个迭代器 std map
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 有关shared_ptr的竞态条件示例

    为什么没有竞争条件代码片段 https godbolt org z nEYPYqdqK below include
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 模板类中模板方法专门化的 clang 自动返回类型错误?

    试图理解另一个问题 https stackoverflow com questions 38054055 clang fails to compile template function with auto return type insi
  • 以编程方式阻止 Vista 桌面搜索 (WORDS) 对映射网络驱动器上的 pst 文件建立索引

    经过几天的多次尝试 我没有找到任何 100 的解决方案来解决这个问题 我的搜寻和调查范围 直接访问注册表 HKLM SOFTWARE Microsoft Windows Search CrawlScopeManager Windows Sy
  • C 中的 2 个字符要短

    我有2个字符 Char 128和查尔2 如何将这些字符转为 Short640 in C 我试过了 unsigned short getShort unsigned char array int offset short returnVal
  • asio::this_coro::executor 的实现是什么

    在协程函数中 我们可以添加auto ex co await asio this coro executor 获取该协程的执行者 但当我想了解它的定义时 我发现了这个 Awaitable type that returns the execu
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗

随机推荐

  • 使用 node.js 监视文件夹的更改,并在更改时打印文件路径

    我正在尝试编写一个 node js 脚本来监视文件目录中的更改 然后打印更改的文件 如何修改此脚本 以便它监视目录 而不是单个文件 并在目录中的文件名称发生更改时打印它们 var fs require fs sys require sys
  • 平衡拼接图像之间的对比度和亮度

    我正在从事一个图像拼接项目 并且我知道处理图像的对比度和亮度有不同的方法 我当然可以在缝合图像之前处理这个问题 但结果并不像我希望的那样一致 所以我的问题是 在拼接完成后是否有可能 平衡 或更确切地说 均衡 彩色图片的对比度和亮度 您希望不
  • ArrayList 限制保存 10 个值

    我正在使用一个ArrayList在我的代码中 它由一个填充EditText领域 但我想限制ArrayList所以它只能保存 10 个值 添加 10 个值后 如果另一个值尝试添加 我只需要它不添加到Array 有人知道如何做到这一点吗 pri
  • 在什么情况下应该使用实例变量而不是其他变量类型?

    我正在使用 Ruby on Rails 3 我想知道在什么情况下应该使用实例变量而不是其他变量类型 以及是否存在安全原因 Example Using an instance variable accounts Account find Us
  • Windows 下 GNU C/C++ 的内存泄漏检测 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 哪些内存泄漏检测工具可用于 Windows 上的开源 C C 我一直在使用 VLD 视觉检漏仪 有时 它对于好的代码和更复杂的代码都效果很好 它并不完美
  • C# 中的批量更新

    为了在数据库中插入大量数据 我曾经将所有插入信息收集到一个列表中 并将该列表转换为DataTable 然后我通过以下方式将该列表插入数据库SqlBulkCopy 我将生成的列表发送到哪里LiMyList其中包含我要插入数据库的所有批量数据的
  • 删除数据帧行的简单方法对没有行匹配删除条件的实例具有鲁棒性

    R 中数据操作的一项常见任务是通过删除与特定条件匹配的行来对数据帧进行子集化 然而 在 R 中执行此操作的简单方法在逻辑上似乎不一致 对于没有经验的人 例如我自己 来说甚至是危险的 假设我们有一个数据框 我们想要排除属于 G1 处理的行 T
  • 适合特定宽度的字符串长度

    我确信我错过了一些明显的东西 我有一个我打算在其中绘制文本的区域 我知道它 区域 的高度和宽度 我想知道宽度可以容纳多少个字符 单词 最好是字符 第二个问题 如果该行太长 我想绘制第二条线 所以我想我还需要获取文本的高度 包括它认为正确的垂
  • AutoIt 类似于 Java 的 GUI 自动化工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要对我的模块插入的软件进行自动化 UI 测试 我无权访问主机的代码 所以我需要像 AutoIt 这样的东西 由于 AutoIt 不能与 Swin
  • ArraySegment 类有什么用?

    我刚刚遇到ArraySegment
  • 标记未出现在传单中的连续世界上

    当我设置选项时continuousWorld true标记不会显示在克隆图块上 仅显示在主世界上 这是设计好的行为吗 可能是其他选项 我没有注意到 来显示这些标记的存在 UPD My aim to repeat markers on eve
  • 如何使用python进行坐标仿射变换?第2部分

    我有与这里描述的相同的问题 如何使用python进行坐标仿射变换 我试图使用所描述的方法 但由于某些原因我会收到错误消息 我对代码所做的更改是替换主系统和辅助系统点 我通过使用不同的原点创建了辅助坐标点 在我正在研究这个主题的实际情况中 测
  • 在 gevent 中,如何转储所有正在运行的 greenlet 的堆栈跟踪?

    出于调试目的 我想迭代所有 greenlet 并获取它们的跟踪记录 如何使用 gevent 做到这一点 基本上 我想做的 gevent 相当于this 您可以使用gc模块迭代堆上的所有对象并搜索 greenlet Greenlets 将堆栈
  • 删除 Google Apps 脚本文档服务中的内容

    如何刷新 Google Apps 脚本文档服务中的文档 我是否需要循环遍历所有类型的元素 例如段落 图像 表格并在小时候删除它们 有没有更简单的方法来删除文档正文中的所有内容 谢谢你 根据文档 the Document setText应该可
  • 如何标准化图像颜色?

    在他们的论文中描述维奥拉 琼斯物体检测框架 Viola 和 Jones 提出的鲁棒实时人脸检测 据说 用于训练的所有示例子窗口均已标准化为方差 最大限度地减少不同照明条件的影响 我的问题是 他们使用什么样的工具来标准化图像 我不是在寻找 V
  • 无法将 Jinja2 模板包含到 Pyinstaller 分发中

    我有一个使用 Jinja2 模板的 python 脚本 我正在尝试使用 Pyinstaller 创建一个单文件夹发行版 在 Jinja 中 我让程序通过使用PackageLoader班级 下面的代码显示它指向我的templates下的文件夹
  • 使用 tSQLt 对 SSIS 包进行单元测试

    我真的很喜欢 tsqlt 来测试过程和函数 但真的希望能够执行 SSIS 包并利用 FakeTable 和 AssertEquals 来确定 SSIS 包是否做了它应该做的事情 有没有人探索过这条路径 是否可以通过 tsqlt 包装您的测试
  • 为列名添加前缀

    当阅读以下内容时helpfile应该可以在列名中添加前缀 colnames x do NULL TRUE prefix col 以下内容对我不起作用 我在这里做错了什么 m2 lt cbind 1 1 4 colnames m2 do NU
  • 使用 chrome.tabs 与 browser.tabs 实现浏览器兼容性

    我正在将 Chrome 扩展程序移植到 Firefox 根据 MDN 有一个浏览器选项卡chrome应该支持的API However browser不是 Chrome 稳定对象 同时chrome tabs在 Firefox 中工作得很好 更
  • rdtsc,循环次数过多

    include