2

私はクラスに言ってもらいますClassOne。にClassOneは2つのメソッドがmethod1()ありmethod2()、これらのメソッドは両方とも静的であり、次々に呼び出されます(このように):

ClassOne.method1();
ClassOne.method2();

このシーケンスは変更されないことが保証されています。

上記のケースと次のケースでパフォーマンスに違いがあるかどうかを知りたいと思いました。

2 番目のケース:

method1(){
    method2();
}
4

5 に答える 5

3

パフォーマンスに関しては、どちらの方法でメソッド呼び出しを行っても同じバイトコードが生成され、パフォーマンス上の利点はありません。

理解を深めるために、この記事を ご覧ください http://www.codeproject.com/Articles/30422/How-the-Java-Virtual-Machine-JVM-Works

どのスタイルを使用するかは、各メソッドが実行する機能によって異なります。method1() が method2() によって実行されるタスクに依存している場合は、それを分離しますが、そうでない場合、かつ method2() が method1() の終了後に実行する必要があることを行う場合は、それらを分離して維持します。関心の分離。

于 2013-01-18T15:46:16.917 に答える
2

生成されたバイトコードを調べて、自分で結論を出すことができます:

ソースコード #1

public class Clazz {

    public static void main(String[] args){
        Clazz.method1();
        Clazz.method2();
    }

    public static void method1() {

    }

    public static void method2() {

    }
}

バイトコード #1

Compiled from "Clazz.java"

public class Clazz {
  public Clazz();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method method1:()V
       3: invokestatic  #19                 // Method method2:()V
       6: return

  public static void method1();
    Code:
       0: return

  public static void method2();
    Code:
       0: return
}

ソースコード #2

public class Clazz {

    public static void main(String[] args){
        Clazz.method1();
    }

    public static void method1() {
        method2();
    }

    public static void method2() {

    }
}

バイトコード #2

Compiled from "Clazz.java"

public class Clazz {
  public Clazz();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #16                 // Method method1:()V
       3: return

  public static void method1();
    Code:
       0: invokestatic  #21                 // Method method2:()V
       3: return

  public static void method2();
    Code:
       0: return
}


結果

生成されたバイトコードは静的メソッドと同じです

于 2013-01-18T16:09:00.537 に答える
2

主に ClassOne がメッセージ受信者へのポインターであり、2番目のケースではメッセージの受信者がクラスオブジェクト自体であるスコープ内の this オブジェクトであるため、違いがあるとは思えません。ただし、これを証明したい場合は、2 つの空のメソッドを数百万回呼び出す単純なアプリを作成し、2 つのアプローチの平均時間を比較してください。

于 2013-01-18T15:44:50.177 に答える
1

パフォーマンスの違いはないはずです。method2() が常に method1() の後に実行される場合は、Second Case を使用することをお勧めします。

于 2013-01-18T15:37:53.297 に答える
1

この場合、最善の選択肢は、「method1」の最後に「method2」の本体を配置してこれをリファクタリングし、「method2」へのすべての呼び出しを削除し、「method1」の名前を「method1」という事実を反映するものに変更することです。 「method1」へのすべての参照の名前を変更するとともに、現在両方の操作を実行しています。

于 2013-01-18T15:42:18.790 に答える