【发布时间】:2015-02-02 21:26:05
【问题描述】:
我正在寻找一种编程技术,以确保用于基准测试的变量(没有可观察到的副作用)不会被编译器优化掉
This 提供了一些信息,但我最终使用了folly 和以下函数
/**
* Call doNotOptimizeAway(var) against variables that you use for
* benchmarking but otherwise are useless. The compiler tends to do a
* good job at eliminating unused variables, and this function fools
* it into thinking var is in fact needed.
*/
#ifdef _MSC_VER
#pragma optimize("", off)
template <class T>
void doNotOptimizeAway(T&& datum) {
datum = datum;
}
#pragma optimize("", on)
#else
template <class T>
void doNotOptimizeAway(T&& datum) {
asm volatile("" : "+r" (datum));
}
#endif
我想使用上面的,但我对它的工作原理知之甚少。我最感兴趣的是非 VC++ 部分和为什么/如何行
asm volatile("" : "+r" (datum));
创建一个不可优化的上下文或为什么人们会选择实现这样的事情。两种方法之间的比较也会很有趣(我不知道pragma optimize 是如何工作的,但它看起来像一个更清洁的解决方案 - 虽然不可移植)
【问题讨论】:
标签: c++ c++11 assembly benchmarking c++14