调用函数链是否有开销? 例如,在以下for循环中:
for(int i = 0; i < n; i++)
{
var=object.method1().method2().method3();
}
第一个效率低于第二个吗?
var = object.method1().method2();
for(int i = 0; i < n; i++)
{
var.method3();
}
我关心的是知道函数调用/返回的开销是多少,而不是函数在内部做的事情。
感谢。
答案 0 :(得分:3)
您的两个片段在功能上并不相同。
你的原始问题被标记为c ++ / Java,所以我们就这么说吧。功能语言可能会以不同方式对待它。
一般来说,第二个版本更快,因为method1().method2()
只需要调用一次。在C ++和Java中,编译器很难确定调用method1().method2()
是否有任何副作用。考虑一种以用户输入为例的方法。
如果方法有副作用,编译器无法对var = object.m1().m2().m3()
中的调用次数进行任何优化。
链接本身不会产生任何开销。
答案 1 :(得分:2)
考虑到它的伪代码,第二个应该更快,因为你不需要为每次迭代调用method1
和method2
。
答案 2 :(得分:1)
如果你指的是method cascading,你就有了这个:
class Object
{
public:
Object& Method1()
{
// do something
return *this;
}
Object& Method2()
{
// do something
return *this;
}
Object& Method3()
{
// do something
return *this;
}
};
所以调用这样的函数
obj.Method1().Method2().Method3();
在功能上等同于
obj.Method1();
obj.Method2();
obj.Method3();
简而言之,没有性能受到打击。它只不过是一种方便的习惯用语。您面临的一个问题是,由于您被迫返回对this
的引用,因此您无法返回有意义的内容(例如,这些函数的结果)。
如果您指的是method chaining:
每个方法都必须返回一些具有链中相应方法的对象:
class Object
{
public:
std::vector<int>& Method1()
{
// do something
return _vec;
}
private:
std::vector<int> _vec;
};
所以打电话
obj.Method1.size();
与调用相同
std::vector<int>& vec = obj.Method1();
vec.size();
所以再一次,没有表现出色。
但是,如果您要将Method1
更改为按副本而不是按引用返回,则可能会影响性能(例如,如果实际复制了该向量)。
尽管如此,我认为你的问题很糟糕。你的第二个例子每次迭代少了2次函数调用,所以是的,它比每次迭代调用3个函数更有效。但是,我认为这不是你所要求的。
答案 3 :(得分:0)
这实际上取决于编译器的智能程度,但假设代表编译器没有进行特殊优化,在您列出的示例中,您绝对最好用第二个示例。在循环之前预先缓存`object.method1()。method2()'的返回值将绝对节省您的时间,因为您不必每次迭代时都进行这些函数调用或访问这些变量。
调用单个方法比简单地访问局部变量会有更多的开销,在您的示例中,您调用两个方法来访问单个返回值。
答案 4 :(得分:0)
在第一个例子中,method1()和method2()被称为“n”次。在第二个示例中,method1()和method2()仅被调用一次。如果“有效”意味着“花费最少的时间”,那么第二个肯定会更有效率。