最近我注意到在我有多个源文件(file1.cpp
,file2.cpp
,...)的项目中,它可能会影响执行时间,而不是函数A,这将是由另一个函数B调用,在与该函数B相同的源文件中定义。
在我的情况下,当两者都在同一file1.cpp
中定义时,函数B占用大约90%的执行时间,而分析器分析不会返回函数A的执行时间(由B调用)。
但如果它们是在分开的文件中定义的,则执行时间增加~150%,功能A需要约65%的时间,而B只需约25(总共约90%)。
为什么执行时间会增加?功能诽谤位置是否会影响他们如何调用?我无法弄清楚。
我应该说在这一点上我使用了优化级别3,因此在两种情况下都应该在B中内联函数A.
编辑:我使用的是Linux Ubuntu 14.04,我使用g++
和以下标志进行编译:{{1}}。
我还包括A和B儿子,可以更好地理解。正如你所能,A由另一个C函数从B调用,但那个似乎不是问题:
答:
-O3 -pg -ggdb -Wall -Wextra -std=c++11
B:
size_t A (const Matrix& P, size_t ID) {
size_t j(0);
while (P[j][0]!=ID) {
++j;
}
return j;
}
C:
Matrix B (const Matrix& P, const Matrix& O, Matrix* pREL, double d, const Vector& f) {`
size_t length (O.size()) ;
Matrix oREL ( *pREL ) ;
for (size_t i(0); i<length; ++i) {
for (size_t j(0); j<=i; ++j) {
double fi(f[O[i][0]-1]);
if (f.size()==1) fi = 0.0;
if (i!=j) {
double gAC, gAD, gBC, gBD, fj(f[O[j][0]-1]);
if (f.size()==1) fj = 0.0;
gAC = C(pREL,P,O,i,j,dcol,dcol);
gAD = C(pREL,P,O,i,j,dcol,scol);
gBC = C(pREL,P,O,i,j,scol,dcol);
gBD = C(pREL,P,O,i,j,scol,scol);
oREL[i][j] = 0.25 * (gAC + gAD + gBC + gBD)
* (1 - d*(fi+fj));
} else if (i==j) oREL[i][i] = 0.5 * ( 1.0+C(pREL,P,O,i,i,dcol,scol) )
* (1.0-2.0*d*fi );
}
}
delete pREL;
return oREL;
}
答案 0 :(得分:1)
是。编译器只能在内联点知道函数定义时内联函数。如果将它放在其他编译单元中,它可能不知道它。在你的情况下,我假设编译器是&#34;思考&#34;:他正在调用这个函数,但我不知道它在哪里,所以我做了一个正常的调用,让链接器稍后担心它。
因此,应该内联的代码通常放在头文件中。
答案 1 :(得分:0)
首先,当您关心性能和基准测试时,应在编译器中启用optimizations。
我假设您在Linux上使用GCC,因此您使用g++
进行编译。
如果您关心性能,则应使用g++ -Wall -O2
进行编译。
您可以通过编译并将与g++ -Wall -O2 -flto
当然,您可以使用-O3
代替-O2