为什么在这种情况下内联函数会花费更多时间?代码如下:

时间:2018-11-18 13:58:29

标签: c++ inline

我正在尝试测试内联函数如何为C ++编译器节省时间。因此,我编写了一个演示代码来测试使用内联(f1)的函数与不使用内联(f2)的另一个函数之间的运行时间差。但是,经过测试,我发现内联案例比内联案例要花费更多。然后,我尝试在主要功能中更改f1和f2的测试顺序(测试f2花费了时间),在这种情况下,f2的花费会更少。因此,结果似乎永远是前端时钟中的一个,它将花费更多,与inline没有连接或没有inline。为什么在这种情况下内联函数会花费更多时间?代码如下:

#include <stdio.h>
#include <time.h>
#include <iostream>
#include <sstream>
using namespace std;

inline const string& f1(const string &s1, const string &s2)
{
    return s1.size() < s2.size() ? s1 : s2;
}

const string& f2(const string &s1, const string &s2)
{
    return s1.size() < s2.size() ? s1 : s2;
}

int main ()
{
   clock_t start_t,end_t;
   char s[10]="1000";
   static int N = 100000;
   clock_t start2_t,end2_t;
   char s2[10]="1000";
   static int i =0;

   start_t = clock();
   for(i = 0;i<N;i++)
       f1("100",s);
   end_t = clock();

   start2_t = clock();
   for(i = 0 ;i<N;i++)
       f2("100",s);
   end2_t = clock();

   printf("Inline:It took %d .\n",(int)(end_t - start_t)); 
   printf("No-Inline:It took %d .\n",(int)(end2_t - start2_t)); 
}

以下是结果:

    Inline:It took 10246 .
    No-Inline:It took 9385 .

1 个答案:

答案 0 :(得分:2)

使用这样的幼稚性能指标通常会产生令人困惑的结果。优化设置是最大的困惑之一,发布版本(优化):

/mnt/v/CLionProjects/StackOverflow/cmake-build-release/StackOverflow
Inline:It took 0 .
No-Inline:It took 0 .

Process finished with exit code 0

调试版本(未优化):

/mnt/v/CLionProjects/StackOverflow/cmake-build-debug/StackOverflow
Inline:It took 15625 .
No-Inline:It took 15625 .

Process finished with exit code 0

优化的运行无需花费任何时间,因为编译器认识到代码无法完成任何事情(花费CPU周期除外)。难以设计性能指标以确保它们确实在测试您认为要测试的内容,尤其是在启用优化的情况下。但是,最经常需要的是优化代码的性能。除非您实际投入精力来设计良好的性能测试,否则最好的事情通常是编写应用程序代码并使用实际数据进行测试,或者相信专家会告诉您的内容。虽然我不是编译器和目标代码生成专家,但多年来我了解到,建议编译器使用内联代码是要求编译器优先考虑速度而不是大小,而要求编译器不使用内联代码则要求这样做。优先选择大小而不是速度。但是两个请求都没有绑定到编译器。