内联函数性能

jac*_*ver 2 c++ performance inline function

我对内联函数有轻微的性能问题.请考虑以下代码: -

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这在编译和执行时(带有和不带有-finline-function标志)在我的计算机上大约需要1.90秒.但是,当我用宏替换内联函数时,它只需要1.26秒.虽然函数执行2亿次的可能性很小,但我仍然想知道是否有使用内联函数实现这种性能的方式?

编辑:在收到几个令人反感的评论后,我意识到我对自己的问题不是很清楚.我只是想知道如何在不使用任何优化标志的情况下实现相同的性能.当然,单纯使用-O2或-O3更为明智,我只想学习.

Guy*_*ton 13

内联函数和宏应该具有相同的性能,因此您的函数可能没有内联.尝试添加

__attribute__((always_inline))

到你的功能声明.(另见GCC文档在这里):

通常,除非指定了优化,否则不会内联函数.对于内联声明的函数,即使未指定优化级别,此属性也会内联函数.


Pot*_*ter 10

对我来说,在-O3优化时使用GCC 4.2.1,内联函数和宏之间的运行时没有区别.在任何一种情况下它都是0.185秒,我非常怀疑我的笔记本电脑比你的机器快10倍.

g++ -S进一步运行表明目标代码是相同的.

我没有调整int L,并int Rvolatile int迫使它实际上执行循环.

编辑:较低优化设置的目的是帮助调试.内联函数可能较慢的一个原因-O0是编译器确保所有变量都处于一致状态,您可以在调试器中停止并查看内联函数内的代码行.

有时优化使得无法在内部中断或逐步执行内联函数,就像宏一样.

  • @jack:如果时间变为*零*,您如何得出内联效率低的结论? (4认同)
  • @Jack:当您关闭优化编译时,询问与性能相关的问题是完全没有意义的.假设编译器将执行优化(如内联函数),即使您特别要求它*不*执行优化也没有任何意义. (2认同)