我应该从包装函数中获得多少开销

时间:2011-10-09 00:47:25

标签: c++

此问题与此Extend an existing API: Use default argument or wrapper function?或多或少相似 但是差异很大。
请阅读。

我有一个类Foo,它具有函数oldFunc,用于程序的许多部分 为了向Foo引入新的行为,我实现了newFunc并使其成为私有的 oldFunc的调用者继续使用相同的API,但如果他们设置了标志,则可以获得新的行为 调用setUseType()函数。

伪代码如下:

class Foo
{
public:
  Foo(){ useNew = false;}
  void setUseType(bool useType){ useNew = useType;}
  std::string oldFunc(int r) 
  {
     if(useNew )
    {
      return newFunc(r);
    }
    return std::string("Some value after doing some work");
  }
 private:
   std::string newFunc(int r){ return std::string("Some value after doing some work");}
   bool useNew;
};

问题 oldFunc在循环内被多次调用(数百万次)。
newFunc内包裹oldFunc我应该承担多少开销。 从理论上讲,如果oldFuncnewFunc在实现中有一定的理由,那么就有理由期待 标志设置UseType(true)的调用速度较慢?

3 个答案:

答案 0 :(得分:3)

你可以测量它。那你肯定知道。 (至少为了比较目的)。

答案 1 :(得分:2)

在这种特殊情况下,任何非白痴编译器都没有开销,因为函数将被内联。您的代码等同于:

class Foo
{
public:
  Foo(){ useNew = false;}
  void setUseType(bool useType){ useNew = useType;}
  std::string oldFunc(int r) 
  {
     if(useNew )
    {
      return std::string("Some value after doing some work");//newFunc inlined here
    }
    return std::string("Some value after doing some work");
  }
 private:
   bool useNew;
};

如果没有内联,则对新函数的调用会有额外的跳转。这就是所有额外的计算时间进入的地方。即使考虑了数百万次通话,这种额外的跳跃也很可能会导致更少的延迟。我建议你做一些分析,如果你确实有速度问题并找出真正的瓶颈 - 很可能不是额外的呼叫。

答案 2 :(得分:0)

我认为任何现代编译器都会优化代码,使得通过oldFunc()调用newFunc()的成本不会比直接调用oldFunc()更昂贵。

但请注意,无论是否使用旧函数和新函数,都会添加一个if语句,每次调用oldFunc()时都会对其进行求值。所以现在你对oldFunc()的所有调用都变慢了一点。

添加if语句的开销可能在噪声中,也可能很大,取决于。您应该测量调用原始oldFunc()1,000,000次所需的时间,然后使用添加的if语句测量相同的内容。如果差异很大,您可能希望查看允许客户端选择调用哪个方法以避免if语句的其他方法,例如通过成员函数指针。