我应该在哪个源文件中定义一个函数

时间:2015-03-15 20:46:36

标签: c++ function optimization

最近我注意到在我有多个源文件(file1.cppfile2.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;
}

2 个答案:

答案 0 :(得分:1)

是。编译器只能在内联点知道函数定义时内联函数。如果将它放在其他编译单元中,它可能不知道它。在你的情况下,我假设编译器是&#34;思考&#34;:他正在调用这个函数,但我不知道它在哪里,所以我做了一个正常的调用,让链接器稍后担心它。

因此,应该内联的代码通常放在头文件中。

答案 1 :(得分:0)

首先,当您关心性能和基准测试时,应在编译器中启用optimizations

我假设您在Linux上使用GCC,因此您使用g++进行编译。

如果您关心性能,则应使用g++ -Wall -O2进行编译。

您可以通过编译并将g++ -Wall -O2 -flto

链接来启用link time optimizations

当然,您可以使用-O3代替-O2