静的メソッドはアクセスできないため、バイトコードがわずかに小さくなる可能性があります。 this
。速度に違いはないと思います(もしそうなら、おそらく全体として違いを出すには小さすぎるでしょう)。
私はそれらを静的にするつもりです。しかし、それは私だけです。
編集:この回答は、おそらくバイトコードサイズに関する根拠のないアサーションのために、投票を続けています。実際にテストを実行します。
class TestBytecodeSize {
private void doSomething(int arg) { }
private static void doSomethingStatic(int arg) { }
public static void main(String[] args) {
// do it twice both ways
doSomethingStatic(0);
doSomethingStatic(0);
TestBytecodeSize t = new TestBytecodeSize();
t.doSomething(0);
t.doSomething(0);
}
}
バイトコード(で取得javap -c -private TestBytecodeSize
):
Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private void doSomething(int);
Code:
0: return
private static void doSomethingStatic(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: invokestatic #2; //Method doSomethingStatic:(I)V
4: iconst_0
5: invokestatic #2; //Method doSomethingStatic:(I)V
8: new #3; //class TestBytecodeSize
11: dup
12: invokespecial #4; //Method "<init>":()V
15: astore_1
16: aload_1
17: iconst_0
18: invokespecial #5; //Method doSomething:(I)V
21: aload_1
22: iconst_0
23: invokespecial #5; //Method doSomething:(I)V
26: return
}
静的メソッドを呼び出すには、2つのバイトコード(byteops?)が必要ですiconst_0
(引数用)およびinvokestatic
。
非静的メソッドを呼び出すには、aload_1
(TestBytecodeSize
オブジェクトの場合は)、iconst_0
(引数の場合は)、およびの3つが必要invokespecial
です。(これらがプライベートメソッドでなかった場合、それはのinvokevirtual
代わりにあったことに注意してinvokespecial
ください。JLS§7.7メソッドの呼び出しを参照してください。。)
さて、先ほど言ったように、invokestatic
バイトコードが1つ少なくて済むという事実を除いて、これら2つのパフォーマンスに大きな違いがあるとは思いません。invokestatic
そしてinvokespecial
わずかに速くよりもする必要があります両方invokevirtual
、彼らは両方の使用の静的、動的の代わりに結合が、どちらかが速く、他のよりある場合、私は考えを持っていないので、。良い参考文献も見つかりません。私が見つけることができる最も近いものは、この1997年のJavaWorldの記事です。
これらの命令によって呼び出されるメソッドは静的にバインドされているため、最も速い命令はinvokespecial
andになる可能性が最も高くなりますinvokestatic
。JVMがこれらの命令のシンボリック参照を解決して直接参照に置き換えると、その直接参照には実際のバイトコードへのポインタが含まれる可能性があります。
しかし、1997年以降、多くの変化がありました。
結論として...私はまだ私が以前言ったことに固執していると思います。速度はせいぜいマイクロ最適化であるため、速度を優先して選択する必要はありません。