1. ホーム
  2. java

[解決済み] java メソッドコールはどれだけ高価か

2023-06-10 02:04:02

質問

私は初心者なのですが、コードを繰り返すのは良くないといつも読んでいます。しかし、そうしないためには、通常、余分なメソッド呼び出しを持っていなければならないようです。例えば、次のようなクラスがあるとします。

public class BinarySearchTree<E extends Comparable<E>>{
    private BinaryTree<E> root;
    private final BinaryTree<E> EMPTY = new BinaryTree<E>();
    private int count;
    private Comparator<E> ordering;

    public BinarySearchTree(Comparator<E> order){
        ordering = order;
        clear();
    }

    public void clear(){
        root = EMPTY;
        count = 0;
    }
}

実際のメソッドを呼び出すのではなく、clear()メソッドの2行をコピーしてコンストラクタに貼り付ける方が最適でしょうか?もしそうなら、どれくらいの違いがあるのでしょうか? コンストラクタが 10 回のメソッド呼び出しを行い、それぞれがインスタンス変数に値を設定するだけだとしたらどうでしょうか? 最良のプログラミング方法は何ですか?

どのように解決するのですか?

<ブロッククオート

実際のメソッドを呼び出すのではなく、clear() メソッドの 2 行をコピーしてコンストラクタに貼り付ける方が最適でしょうか?

コンパイラーはその最適化を実行することができます。そして、JVMもそうすることができます。コンパイラの作者とJVMの作者によって使用される用語は、"inline expansion"です。

もしそうなら、どれくらいの違いがあるのでしょうか?

測ってみてください。多くの場合、違いがないことがわかるでしょう。また、これがパフォーマンスのホットスポットであると信じるなら、あなたは間違った場所を探していることになり、それが測定する必要がある理由です。

コンストラクタが 10 回のメソッド呼び出しを行い、それぞれがインスタンス変数に値を設定するだけだとしたらどうでしょうか。

繰り返しますが、それは生成されたバイトコードとJava仮想マシンによって実行された任意の実行時最適化に依存します。コンパイラー/JVM がメソッド呼び出しをインライン化できる場合、実行時に新しいスタック フレームを作成するオーバーヘッドを回避するための最適化が実行されます。

ベストなプログラミングプラクティスは何ですか?

早すぎる最適化を避けること。ベストプラクティスは、読みやすく設計されたコードを書き、アプリケーションの性能のホットスポットに対して最適化することです。