3

私の推測では、コンパイラの最適化 (例: インライン化) では、メソッドがいくつかのレベルで「ネスト」されているかどうかは実質的に違いはありません。果たしてそうであろうか。

たとえば、次の 3 つのクラスが宣言されているとします。

public class Third extends Second
{
    public int test3() // Call test2() and nothing else
    {
        return super.test2();
    }
}

public class Second extends First
{
    public int test2()
    {
        return super.test1(); // Call test1() and nothing else
    }
}

public class First
{
    public int test1() // Calculate a result somehow
    {
        int result = 0;
        ...
        return result;
    }
}

既にインスタンス化された 3 つのオブジェクトthirdsecondおよびが与えられた場合first、次の呼び出しのコストは実質的に同じですか?

third.test3();
third.test2();
third.test1();
second.test2();
second.test1();
first.test1();

メソッドの名前が同じ場合、最適化に違いはありますか?

4

2 に答える 2

4

メソッド呼び出しのオーバーヘッドについて心配する必要がありますか?ほとんどの場合、違います。このオーバーヘッドが重要になるのは、ループ内で非常に頻繁に呼び出されるメソッドがある場合のみです。

通常、ナノ秒の時差は、メソッドが実行している作業が実行に費やされる時間の大部分になるときにスクワットを意味します。さらに、おっしゃるように、Java HotSpot VMは、必要に応じてメソッド呼び出しのインライン化を行います。ただし、その決定はVM次第です。このリンクを参照してください:

http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html

最近のソフトウェア開発では、もっと心配すべきことがあります。そのアプリを出荷してください!

于 2012-01-24T01:09:48.760 に答える
3

ネストされた各呼び出しは、呼び出しスタックの別の位置を占めます。メソッドで他に多くのことを行っていないため、それがメソッドを呼び出す「コスト」の大部分を占めるため、違いが生じます。

ユーザーにはまったく気付かない違いですが、それでも違いはあります。

于 2012-01-24T00:58:12.323 に答える