我想自动调整我的代码,为此必须测量某些代码部分所需的时间,例如
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
都是无关紧要的。关于这一切
确保 t0
和 dt
以正确的顺序写入
(实际上,它通常不能确保这一点);它使不
关于 section_of_code_to_be_timed
的保证
t0
或 dt
。
关于c++ - 对一段代码进行计时时是否需要 volatile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20350941/