此问题与此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
我应该承担多少开销。
从理论上讲,如果oldFunc
和newFunc
在实现中有一定的理由,那么就有理由期待
标志设置UseType(true)
的调用速度较慢?
答案 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语句的其他方法,例如通过成员函数指针。