4

関数チェーンの呼び出しにオーバーヘッドはありますか? たとえば、次の 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();
}

私の懸念は、関数の呼び出し/戻りにオーバーヘッドがあるかどうかを知ることであり、関数が内部で何をするかということではありません。

ありがとう。

4

5 に答える 5

3

2 つのスニペットは機能的に同等ではありません。

あなたの元の質問はc++/Javaとタグ付けされていたので、それで行きましょう。関数型言語では、これを別の方法で処理する場合があります。

method1().method2()一般に、を 1 回呼び出すだけでよいため、2 番目のバージョンの方が高速です。method1().method2()C++ と Java では、呼び出しに副作用があるかどうかをコンパイラが判断するのは非常に困難です。たとえば、ユーザー入力を受け取るメソッドを考えてみましょう。

メソッドに副作用がある場合、コンパイラは の呼び出し数を最適化できませんvar = object.m1().m2().m3()

チェーン自体はオーバーヘッドを発生させません。

于 2013-11-13T18:34:03.577 に答える
2

疑似コードであることを考えると、反復ごとに呼び出される必要がなくmethod1、呼び出される必要がないため、2 番目のコードの方が高速である必要があります。method2

于 2013-11-13T18:22:32.387 に答える