使用 std::chrono 计算持续时间会给出 0 纳秒,而它应该需要很长时间

2023-11-29

我试图使用 std::chrono 计算 for 循环所花费的持续时间,但即使我通过增加绑定值使循环花费更长的时间,它也会给出 0 纳秒,这是代码:

#pragma pack(1) // dont align let's let it take longer
struct Foo{
    int x;
    char c;
    int z;
} ;
void take_time()
{
    Foo f;
    auto t1 = std::chrono::system_clock::now();
    register int c = 0;
    int x=0,y=0,z=1;
    for (c=0;c<10000;c++){ // even if i put  1000000000 it will take 0 nanosec !!!!!
        f.z = x+y;
        f.z += z-x+y;
    }
   std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}

output :

token time : 0

但是当我将循环计数器的界限增加到非常非常大的值时,它突然需要永远!! ,如果我输入 c

答案: 正如 WhiZTiM 所说,编译器正在删除循环,因为它没有做任何有用的事情(感谢 gcc asm(""),一个空的汇编语言,位于循环中的任何位置。这将告诉编译器有一些低级操作他无法优化! ,或者我们可以对循环中使用的任何变量使用 volitile 关键字,以防止编译器进行与该变量相关的任何优化。谢谢大家,我希望这有帮助


首先,使用初始化变量是a sin.

优化器肯定发现循环是无用的(真的,应该是什么值x, y, z在循环);并且循环的结果没有被使用(没有副作用),所以它删除了生成代码中的循环。

void take_time()
{
    Foo f;
    auto t1 = std::chrono::system_clock::now();
    register int c = 0;
    int x,y,z;

    ///// Result not used
    for (c=0;c<10000;c++){ // even if i put  1000000000 it will take 0 nanosec !!!!!
        f.z = x+y;
        f.z += z-x+y;
    }
    /// We can discard the above

   std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}

顺便说一句,register关键字there已被弃用。


对于 GCC 和 clang,有一种方法可以“吓唬”优化器,使其无法优化某些变量的使用。我使用这个功能:

template<typename T>
void scareTheOptimizer(T& x){
    asm volatile("" :: "p"((volatile void*)&x) : "memory");
}

因此,当您在循环中调用它时,您现在应该看到一些计时。

void take_time()
{
    Foo f;
    auto t1 = std::chrono::system_clock::now();
    int c = 0;
    int x=0,y=0,z=1;
    for (c=0;c<10000;c++){
        f.z = x+y;
        scareTheOptimizer(f.z);             /// <---- Added Here
        f.z += z-x+y;
    }
   std::cout<<"\ntoken time : "<< std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()-t1).count()<<std::endl;;
}

See it 住在科里鲁

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

使用 std::chrono 计算持续时间会给出 0 纳秒,而它应该需要很长时间 的相关文章

随机推荐

  • 布尔类型

    在代码审查期间 我发现 C 代码的许多地方如下所示 if IsValid return true else return false 甚至 更好 return IsValid true false 我一直想知道为什么不直接写这样的代码 re
  • SBT:遍历项目依赖图

    我有一个多模块 Web 项目 其依赖关系图与此类似 WAR project A1 A2 A3 B1 B2 B22 B3 这就是战争项目所依赖的A1这又取决于A2 and A3等等 现在 在打包 war 项目之前 我想将一些 Web 资源从其
  • C++ 结构体排序

    我有一个自定义结构向量 每次都需要根据不同的标准进行排序 实现运算符 但我希望每次调用 C 标准排序时都能够指定排序标准 怎么做 请注意 运行时间最好高效 Thanks 您可以使用第三个参数定义每次运行排序算法时使用的比较函数 templa
  • jq 尝试使用变量修改 JSON 时出现“无效数字文字”错误

    我想将值通过管道传输到 bash 脚本中 该脚本将使用 jq 更改 json 文件中的值 我已经为此工作了一段时间 但无法克服第一组错误 这是我的简单 json 文件 0000000 pogo AJHVUYKJBOIHKNNLNM 7000
  • 每台计算机是否都有一些唯一的ID,以区分一台计算机和另一台计算机?

    我正在使用 C 在 NET Framework 中开发一个 Windows 应用程序 我想知道每台制造的计算机是否有唯一的 ID 让它由任何制造商制造 但它必须是唯一的 谢谢 比布 检查一下 如何获取计算机的唯一ID 硬盘 ID 卷序列号
  • Node Mailer 错误:本地主机中的“不支持的配置,将 Nodemailer 降级到 v0.7.1 才能使用它”

    我是 Nodejs 新手 尝试从以下地址发送邮件节点邮件程序模块但有错误 即 Unsupported configuration downgrade Nodemailer to v0 7 1 to use it 这是我的代码 var nod
  • Ionic 框架 PdfViewer

    我想开发移动 pdf 电子书应用程序 是否有 ionic 框架的 pdf 查看器组件 我喜欢 mozilla pdf js 我需要离子项目示例 您尝试过角度模块吗ng pdfviewer 因为 Angular 在 Ionic 的底层工作
  • 从Java中的静态方法获取类名

    如何从该类中的静态方法获取该类的名称 例如 public class MyClass public static String getClassName String name what goes here so the string My
  • 视频未在 Web 视图中显示

    我有一个 Html 页面 在这个 Html 页面中我显示一个视频 但该视频没有显示在我的应用程序的 web 视图中 而是显示在默认浏览器中 所以请告诉我问题是什么 下面是我的代码和视频和 html 文件存储到SD卡中 抱歉我的英语沟通不好
  • 如何更改 DatePickerDialog 中 NumberPickers 的顺序

    我想交换月份和日期 旋转器 我想将日期列 微调器 发送到左侧 将月份列 微调器 发送到中间 是否可以 根据来源中的注释 这些的顺序NumberPickers 由用户选择的系统范围日期格式确定 并根据给定用户区域设置确定最佳顺序 没有可用的公
  • 如何让 Android 响应触摸拖动?

    我正在创建一个网络应用程序 其中包含带有溢出的 div 滚动样式 由于 Android 浏览器不支持此功能 因此我需要通过自己的自定义功能来使用触摸和拖动 element bind touchmove function event even
  • 序列化/反序列化协议缓冲区

    我目前正在使用 Protocol Buffers C 版本 3 我正在向不同的服务来回发送消息 目前正在尝试将某些消息中存储的一些数据保存到数据库 实际上可以是任何类型 问题在于byte 被创建为类型字节串 and 列表被创建为重复字段 现
  • 如何在列表框中的项目之间显示分隔线?

    我在 Windows Phone 7 应用程序中使用 ListBox 控件 我想在列表行之间显示分隔线 线 尽管许多 不是 wp7 ListBox 示例似乎都有分隔符 但我无法找到有关此内容的任何信息 受到 NestorArturo 的启发
  • 导航时部分页面更新(PrimeFaces ajax)

    我使用 Facelets 模板完成了一个基本的 JSF 应用程序 我的模板如下
  • Android HTTP 用户代理

    如何在http user agent中获取真实设备 当我使用 WebView 时 我可以获得这样的真实值 HTTP USER AGENT gt Mozilla 5 0 Linux U Android 2 2 en gb LG P500 Bu
  • 如何解码视图状态

    我需要查看 ASP NET 页面的视图状态内容 我寻找视图状态解码器 发现Fridz Onion 的 ViewState 解码器但它要求页面的 url 来获取其视图状态 由于我的视图状态是在回发后形成的 并且是更新面板中操作的结果 因此我无
  • SQL 分组依据/计数:对多个列中的相同值进行计数?

    我试图弄清楚如何编写一个对多个列的值进行计数的查询 结果表在每列中对每个可能的值进行计数any column 示例 假设我有mytable Source data table P1 P2 P3 a b a a a a b b b a b b
  • 对象未添加到 NSMutableArray Objective -C

    我试图简单地将对象添加到可变数组中 但它们不会插入 我没有收到错误或任何错误 我不知道发生了什么 在我的主委托文件中 我将一个数组分成 4 个单独的字符串 如下所示 NSArray split currentParsedCharacterD
  • 如何避免使用 ANTLR3 构建中间和无用的 AST 节点?

    我编写了一个 ANTLR3 语法 该语法细分为更小的规则以提高可读性 例如 messageSequenceChart msc mscHead bmsc endmsc end Where mscHead is a shortcut to ms
  • 使用 std::chrono 计算持续时间会给出 0 纳秒,而它应该需要很长时间

    我试图使用 std chrono 计算 for 循环所花费的持续时间 但即使我通过增加绑定值使循环花费更长的时间 它也会给出 0 纳秒 这是代码 pragma pack 1 dont align let s let it take long