2

私が求めているのは、これを行うことに違いがあるかどうかです:

public Something importantBlMethod(SomethingElse arg) {
    if (convenienceCheckMethod(arg)) {
        // do important BL stuff
    }
}

private boolean convenienceCheckMethod(SomethingElse arg) {
    // validate something
}

この:

public Something importantBlMethod(SomethingElse arg) {
    if (convenienceCheckMethod(arg)) {
        // do important BL stuff
    }
}

private static boolean convenienceCheckMethod(SomethingElse arg) {
    // validate something
}

より自然に思えるので、実際にはオプション 1 を使用します。

では、最初の方法と 2 番目の方法の間にスタイル/規則/パフォーマンスの違いはありますか?

ありがとう、


私がテストしたコメントで示唆されているように、私のベンチマークでは動的な方法の方が高速です。

これはテストコードです:

public class Tests {

    private final static int ITERATIONS = 100000;

    public static void main(String[] args) {
        final long start = new Date().getTime();

        final Service service = new Service();
        for (int i = 0; i < ITERATIONS; i++) {

            service.doImportantBlStuff(new SomeDto());
        }

        final long end = new Date().getTime();

        System.out.println("diff: " + (end - start) + " millis");
    }
}

これはサービス コードです。

public class Service {

    public void doImportantBlStuff(SomeDto dto) {

        if (checkStuffStatic(dto)) {

        }

        // if (checkStuff(dto)) {

        // }
    }

    private boolean checkStuff(SomeDto dto) {
        System.out.println("dynamic");
        return true;
    }

    private static boolean checkStuffStatic(SomeDto dto) {
        System.out.println("static");
        return true;
    }
}

100000 回の反復では、動的メソッドは 577 ミリ秒、静的メソッドは 615 ミリ秒で合格します。

ただし、コンパイラが何をいつ最適化するかがわからないため、これは私にとって決定的ではありません。

これは私が見つけようとしているものです。

4

8 に答える 8

7

パフォーマンス面: 違いはあるとしても、無視できる程度です。

経験則として、メソッドがそのクラスのメンバーと対話しない場合は、メソッドを static と宣言します。

于 2013-03-05T14:41:40.487 に答える
2

そうかもしれないし、そうでないかもしれない。コードの実行ごとに異なる場合があります。

Hotsportコード(または非Hotspot JVMのコード)を掘り下げることなく知ることができる唯一のことは次のとおりです。

これらのオペコードは両方とも、呼び出す実際のメソッドを解決するためのプロセスを持っており、それらのプロセスは比較的似ています(仕様を読むことができます)。実際の実装の指示を数えなければ、どちらが速いかを言うことは不可能です。

invokespecial、余分な値をスタックにプッシュします。これを行う時間は、ナノ秒の何分の1かで数えられます。

そして、このすべてを無意味にすることで、Hotspotは実行できる幅広い最適化を備えています。プログラムの実行中に、実際のメソッド解決を複数回行う必要はおそらくありません。メソッドをインライン化することを選択する場合もありますが(そうでない場合もあります)、そのコストもほぼ同等になります。

于 2013-03-05T15:05:53.620 に答える
2

私によると、静的メソッドのNOearly bindingバインディングは非静的プライベートと同じです。. コンパイラは、バイトコードの作成中に、実際にメソッドのコード (静的または非静的プライベート) をコードに追加します。

更新:この記事を読んだところです。メソッドがそうでない場合、インスタンスメソッドのバインディングはdynamicそうですnon-static private。静的メソッドの方が高速です。

于 2013-03-05T14:45:33.023 に答える
2

メソッドがインスタンス データまたは他のインスタンス メソッドの呼び出しを必要とする場合、それはインスタンス メソッドである必要があります。

関数がその引数のみに依存し、他の静的データに依存しない場合、それもインスタンス メソッドである可能性があります。静的関数を呼び出すときにクラス名を繰り返す必要がなくなります。

static私見、次の場合を除き、関数を作成する必要は特にありません。

  1. 他のクラスから呼び出すことができます (つまりprivate、 ではありません)。
  2. インスタンス変数を参照していない
  3. 他の静的クラス データを参照しています
于 2013-03-05T14:41:32.940 に答える
2

関数の結果が引数以外に依存しない場合は、静的にする必要があります。インスタンスに依存する場合は、インスタンス メンバーにします。

パフォーマンスの問題ではありません。それはセマンティクスについてです。この関数を 1 秒間に 100 万回呼び出していない限り、パフォーマンスの違いに気付くことはなく、それでも大きな違いはありません。

于 2013-03-05T14:42:31.440 に答える
2

それはすべて文脈に依存します。通常、静的メソッド/変数は、外部クラスがそれらを利用できるように、クラスで宣言されます。

ローカル メソッドを呼び出す場合は、通常、静的呼び出しではなくインスタンス メソッドを使用する必要があります。

参考までに、インスタンス メソッドから静的メソッドを呼び出すための構文が間違っています。クラス名を指定する必要があります。

于 2013-03-05T14:44:23.913 に答える
1

私はチェックしました、あなたが知りたかったことを願っています、コードは美しくありません:

public class main {

@SuppressWarnings("all")
public static void main(String[] args) {
    main ma = new main();
    int count = Integer.MAX_VALUE;
    long beg = (new Date()).getTime();
    for (int i = 0; i < count; i++) {
        ma.doNothing();
    }
    System.out.println("priv : " + new Long((new Date()).getTime() - beg).toString());

    beg = (new Date()).getTime();
    for (int i = 0; i < count; i++) {
        doNothingStatic();
    }
    System.out.println("privstat : " + new Long((new Date()).getTime() - beg).toString());

}

private void doNothing() {
    int i = 0;
}

private static void doNothingStatic() {
    int i = 0;
}
}

結果:

priv: 1774
privstat: 1736

priv: 1906
privstat: 1783

priv: 1963
privstat: 1751

priv: 1782
privstat: 1929

priv: 1876
privstat: 1867

静的-非静的プライベートメソッドに依存しているようには見えません。違いは、マシンの現在の負担から来ていると確信しています。

于 2013-03-05T15:38:27.720 に答える
1

私はコーディング競技に参加しており、非静的メソッドは静的メソッドよりも高速であることがわかりました (ただし最小限です)。もちろん、それは使用状況と状況によって異なりますが、静的メソッドは非静的メソッドに比べてパフォーマンスが低下します。慣例により、コードを簡単にするために静的メソッドを使用できますが、クラスのインスタンスを作成してメソッドを呼び出すと、パフォーマンスが向上します。

于 2015-06-11T11:20:43.157 に答える