在调用函数链中是否存在开销?例如,在以下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();
}
我的关注点是了解函数调用/返回是否会有开销,而不是函数内部的操作。
谢谢。
在调用函数链中是否存在开销?例如,在以下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();
}
我的关注点是了解函数调用/返回是否会有开销,而不是函数内部的操作。
谢谢。
你的两个片段在功能上并不相同。
你的原始问题标记为c++/Java,所以我们就用这个。一个函数式语言可能会有不同的处理方式。
通常情况下,第二个版本更快,因为method1().method2()
只需要调用一次。在C++和Java中,编译器很难确定调用method1().method2()
是否具有任何副作用。例如考虑一个接受用户输入的方法。
如果方法具有副作用,则编译器无法对var = object.m1().m2().m3()
中调用的数量进行任何优化。
链式调用本身并不产生任何开销。
考虑到这是伪代码,第二个应该更快,因为你不需要在每次迭代中调用method1
和method2
。
如果你在提到方法级联,你会得到这个:
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
的引用,所以你不能返回有意义的东西(例如这些函数的结果)。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个函数更有效率。但是,我不认为这真的是你想问的。
这真的取决于你的编译器有多聪明,但是假设编译器没有进行特殊优化,在你列出的例子中,你肯定最好使用第二个示例。在循环之前预缓存 `object.method1().method2()` 的返回值绝对会节省时间,因为你不必每次迭代时调用那些函数或访问那些变量。
调用单个方法的开销比简单访问本地变量要大,在你的例子中,你调用了两个方法来访问单个返回值。
thread.sleep(int_max)
的可能性。 - Captain Giraffe