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,循环次数过多 的相关文章

  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • C#动态支持吗?

    看完之后这个帖子 https stackoverflow com questions 2674906 when should one use dynamic keyword in c sharp 4 0k和链接 我还有 2 个问题 问题 1
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • System.Runtime.InteropServices.COMException(0x80040154):[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 C 项目中遇到异常 System Runtime InteropServices COMException 0x80040154 检
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在

随机推荐

  • 使用 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