我在使用内联函数时遇到了轻微的性能问题。考虑以下代码:
inline int left(int x) {
return 2*x;
}
inline int right(int x) {
return 2*x+1;
}
main() {
for(int i=0;i<200000000;i++) {
int L=left(i);
int R=right(i);
}
}在我的计算机上,当编译和执行时(带和不带-finline-function标志)大约需要1.90秒。然而,当我用宏替换内联函数时,它只需要1.26秒。虽然一个函数被执行两亿次的可能性很小,但我仍然想知道是否有使用内联函数来实现这种性能的方法?
编辑:在收到一些攻击性的评论后,我意识到我的问题不是很清楚。我只想知道如何在不使用任何优化标志的情况下实现相同的性能。当然,简单地使用-O2或-O3更明智,我只是想学习一下。
发布于 2011-04-27 13:22:44
内联函数和宏应具有相同的性能,因此您的函数可能不会内联。尝试添加
__attribute__((always_inline))
添加到函数声明中。(另请参阅gcc文档here):
通常,除非指定了优化,否则函数不会内联。对于内联声明的函数,即使未指定优化级别,此属性也会内联函数。
发布于 2011-04-27 13:19:29
对我来说,使用-O3优化的GCC 4.2.1,内联函数和宏在运行时没有区别。这两种情况都是0.185秒,我严重怀疑我的笔记本电脑比你的机器快10倍。
运行g++ -S进一步表明目标代码是相同的。
我确实将int L和int R调整为volatile int,以强制它实际执行循环。
编辑:降低优化设置的目的是为了帮助调试。内联函数在-O0中可能较慢的原因之一是,编译器确保所有变量都处于一致的状态,以便您可以在调试器中的内联函数中的代码行处停下来查看。
有时优化使得不可能突破内联函数或单步执行内联函数,就像宏一样。
https://stackoverflow.com/questions/5799626
复制相似问题