Mungkin menghasilkan bytecode sedikit lebih kecil, karena metode statis tidak akan mendapatkan akses this
. Saya tidak berpikir itu membuat perbedaan dalam kecepatan (dan jika ya, mungkin akan terlalu kecil untuk membuat perbedaan secara keseluruhan).
Saya akan membuatnya statis, karena saya biasanya melakukannya jika memungkinkan. Tapi itu hanya aku.
EDIT: Jawaban ini terus diturunkan, mungkin karena pernyataan tidak berdasar tentang ukuran bytecode. Jadi saya benar-benar akan menjalankan tes.
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);
}
}
Bytecode (diambil dengan 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
}
Meminta metode statis membutuhkan dua bytecode (byteops?): iconst_0
(Untuk argumen) dan invokestatic
.
Meminta metode non-statis membutuhkan tiga: aload_1
(untuk TestBytecodeSize
objek, saya kira), iconst_0
(untuk argumen), dan invokespecial
. (Perhatikan bahwa jika ini bukan metode pribadi, itu akan menjadi invokevirtual
bukan invokespecial
; lihat JLS §7.7 Metode Memohon .)
Sekarang, seperti yang saya katakan, saya tidak berharap akan ada perbedaan besar dalam kinerja antara keduanya, selain dari fakta yang invokestatic
membutuhkan satu bytecode lebih sedikit. invokestatic
dan invokespecial
keduanya harus sedikit lebih cepat daripada invokevirtual
, karena keduanya menggunakan pengikatan statis alih-alih dinamis, tapi saya tidak tahu apakah keduanya lebih cepat dari yang lain. Saya juga tidak dapat menemukan referensi yang bagus. Yang paling dekat yang bisa saya temukan adalah artikel JavaWorld 1997 ini , yang pada dasarnya menyatakan kembali apa yang saya katakan:
Instruksi tercepat kemungkinan besar akan invokespecial
dan invokestatic
, karena metode yang dipanggil oleh instruksi ini terikat secara statis. Ketika JVM menyelesaikan referensi simbolik untuk instruksi ini dan menggantinya dengan referensi langsung, referensi langsung itu mungkin akan menyertakan pointer ke bytecodes yang sebenarnya.
Tetapi banyak hal telah berubah sejak 1997.
Jadi sebagai kesimpulan ... Saya kira saya masih tetap dengan apa yang saya katakan sebelumnya. Kecepatan tidak boleh menjadi alasan untuk memilih satu dari yang lain, karena itu akan menjadi optimasi mikro terbaik.