说我想使用一个函数来衡量运行时间,我想避免编译器仅仅因为认为表达式什么都不做而优化了表达式(它们不做,除了我要测量它们花费多长时间来计算之外)。我没有做像添加到另一个变量之类的怪异like头,而是在GCC中发现了__atribute__((optimize(0)))
。但是,说我有这段代码:
__attribute__((optimize(0))) void test(int n) {
while (n--) {
foo();
}
}
int main() {
std::cout << Timer::measure(test).count() << "ms\n";
}
该属性是否还会阻止编译器优化函数foo()中的代码?我真的只是在尝试可靠地测试一些运行时,并且相对容易地防止编译器完全删除代码(我希望它尽可能地优化代码,而不是删除它,因为它什么都不做!)
这有意义吗?预先感谢!
答案 0 :(得分:1)
我只是想我可以做一个实验(为什么我不早想到这一点),这就是我所做的:
// toggle this
// __attribute__((optimize(0)))
void waste_time() { for (unsigned i = 100000; i--; ); }
// always leave this on
__attribute__((optimize(0)))
void test() {
for (unsigned i = 1000; i--; ) {
waste_time();
}
}
int main() {
std::cout << Timer::measure(test).count() << "ms\n";
}
我对-O3的发现:
waste_time no optimizations: 196.972ms (obviously the loop is not optimized)
waste_time w/ optimizations: 0.001995ms (loop is optimized)
对我来说,这很清楚,__attribute__
不会“传播”嵌套函数调用,因此即使test()具有指定的属性,waste_time()仍将得到优化。