调用链函数会产生开销吗?

时间:2013-11-13 18:20:13

标签: java c++ performance method-chaining

调用函数链是否有开销? 例如,在以下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();
}

我关心的是知道函数调用/返回的开销是多少,而不是函数在内部做的事情。

感谢。

5 个答案:

答案 0 :(得分:3)

您的两个片段在功能上并不相同。

你的原始问题被标记为c ++ / Java,所以我们就这么说吧。功能语言可能会以不同方式对待它。

一般来说,第二个版本更快,因为method1().method2()只需要调用一次。在C ++和Java中,编译器很难确定调用method1().method2()是否有任何副作用。考虑一种以用户输入为例的方法。

如果方法有副作用,编译器无法对var = object.m1().m2().m3()中的调用次数进行任何优化。

链接本身不会产生任何开销。

答案 1 :(得分:2)

考虑到它的伪代码,第二个应该更快,因为你不需要为每次迭代调用method1method2

答案 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()仅被调用一次。如果“有效”意味着“花费最少的时间”,那么第二个肯定会更有效率。