首页 > 后端开发 > C++ > 如何在 C 中强制执行语句顺序以实现准确的时序测量?

如何在 C 中强制执行语句顺序以实现准确的时序测量?

Barbara Streisand
发布: 2024-12-02 03:07:10
原创
340 人浏览过

How Can I Enforce Statement Order in C   for Accurate Timing Measurements?

在 C 中执行语句顺序:全面探索

问题:

在某些场景下,即使在 C 中使用优化时,保持语句执行的特定顺序也至关重要。这是由于编译器能够对语句重新排序以提高性能的能力。

请求:

为了解决此问题,开发人员寻求可以强制执行严格排序的工具或机制的

响应:

基本挑战:

仅通过语言功能或编译器指令强制执行固定顺序在 C 中本质上是具有挑战性的。这是由 C 中优化的基本性质引起的:

  • 算术运算的重新排序:编译器可以自由地对具有明确定义的语义的操作进行重新排序,例如整数加法。这是因为这些操作没有可观察到的副作用。
  • 优化障碍缺失:C 缺少可以阻止语句重新排序的操作或指令。

替代方法:

尽管有限制通过修改编译器的行为,有一些实用的技术可以在对某些数学运算进行计时时实现所需的行为:

数据钳制:

通过同时创建输入和输出数据对于优化器来说是不透明的,因此可以可靠地测量计算时间,同时仍然允许在计算本身内进行优化。这涉及:

  • 将输入数据标记为不可见:在函数中使用低级汇编代码将输入标记为不可优化。
  • 将输出数据标记为不可见: 类似地,将计算结果标记为不可优化。
  • 测量执行时间:准确测量输入和输出数据标记之间的时间。

微基准测试库:

Google Benchmark 等库提供如下功能DoNotOptimize,可用于实现数据钳制。通过将关键计算封装在这些函数中,开发人员可以确保一致的执行顺序。

示例:

以下代码演示了如何使用 DoNotOptimize 来计时执行一个简单的数学运算:

#include <chrono>

static int foo(int x) { return x * 2; }

auto time_foo() {
  using Clock = std::chrono::high_resolution_clock;

  auto input = 42;

  auto t1 = Clock::now();
  DoNotOptimize(input);
  auto output = foo(input);
  DoNotOptimize(output);
  auto t2 = Clock::now();

  return t2 - t1;
}
登录后复制

通过使用 DoNotOptimize 来保护输入和输出数据免受优化,我们可以确保时间测量准确地反映了 foo() 函数的执行时间。

结论:

虽然仅通过 C 语言功能强制执行固定语句顺序是不可行的,但将数据钳制技术与微基准测试库结合使用,提供了一种稳健的方法来一致地测量此类场景中的执行时间。

以上是如何在 C 中强制执行语句顺序以实现准确的时序测量?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板