我对内联函数有轻微的性能问题。 请考虑以下代码: -
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秒。 虽然函数执行2亿次的可能性很小,但我仍然想知道是否有使用内联函数来实现这种性能?
编辑:在收到几条令人反感的评论之后,我意识到我的问题并不是很清楚。我只是想知道如何在不使用任何优化标志的情况下实现相同的性能。当然,简单地使用-O2或-O3更为明智,我只想学习。答案 0 :(得分:13)
内联函数和宏应该具有相同的性能,因此您的函数可能没有内联。尝试添加
__attribute__((always_inline))
到你的函数声明。 (另请参阅gcc docs here):
通常,函数不是内联的 除非指定了优化。对于 函数声明为内联,这个 属性内联函数即使 没有指定优化级别。
答案 1 :(得分:10)
对我来说,在-O3
优化的GCC 4.2.1中,内联函数和宏之间的运行时没有区别。在任何一种情况下它都是0.185秒,我非常怀疑我的笔记本电脑比你的机器快10倍。
运行g++ -S
进一步显示目标代码相同。
我确实将int L
和int R
调整为volatile int
以强制它实际执行循环。
编辑:优化设置较低的目的是帮助调试。内联函数在-O0
可能较慢的一个原因是编译器确保所有变量都处于一致状态,您可以在调试器中停止并查看内联函数内的代码行。 / p>
有时候,优化会使内部函数无法破解或逐步执行内联函数,就像宏一样。