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