c++ - 对一段代码进行计时时是否需要 volatile?

标签 c++ volatile timing

我想自动调整我的代码,为此必须测量某些代码部分所需的时间,例如

auto t0 = std::chrono::high_resolution_clock::now();
section_of_code_to_be_timed(arguments);
auto dt = std::chrono::duration_cast<std::chrono::nanoseconds>
         (std::chrono::high_resolution_clock::now()-t0).counts();
// ... using dt to tweak auto-tuning parameters

我担心的是编译器可能会重新安排对 std::chrono::high_resolution_clock::now()section_of_code_to_be_timed() 的调用,从而使我的计时测量无效。这是一个有效的担忧吗?如果是这样,我可以通过声明 t0 volatile 或其他方式(如何)来阻止它吗?

(我注意到我可以使用 RAII 习语,类似于 std::lock_guard,它似乎没有使用 volatile...)

最佳答案

正式的还是实际的?正式地,调用 std::chrono::high_resolution_clock::now() 不可观察 行为,因此编译器可以按需要的方式重新排列它们。 实际上,编译器会将它们视为可观察的行为, 所以你在这个分数上不会有任何问题。在另一 手,你最好做点什么来确保 section_of_code_to_be_timed 实际上做了一些事情。 (我经常 使它成为一个类的虚拟成员,这就足够了 间接欺骗大多数编译器。在函数本身中, 我确保它产生的结果在外面可见 的功能。)

请注意,无论哪种方式,volatile 都是无关紧要的。关于这一切 确保 t0dt 以正确的顺序写入 (实际上,它通常不能确保这一点);它使不 关于 section_of_code_to_be_timed 的保证 t0dt

关于c++ - 对一段代码进行计时时是否需要 volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20350941/

相关文章:

c - getchar() 在用户写入时

java - 为什么将第一项添加到集合中比第二项慢得多?

c++ - 应用了数据修改堆栈的缓冲区的高效查找

c++ - c++中从其他项目的main方法调用main方法

c++ - 是否确保保留对 volatile 结构的单独成员的写入顺序?

c - 当有多个间接级别时如何解释 volatile

c++ - 在运行时创建 Python3 模块,同时初始化嵌入式 Python

c++段错误(核心转储)与模数

c++ - 我什么时候在 C++ 中使用 const volatile、register volatile、static volatile?

iphone - 何时/何处开始更新位置?