Statik yöntemlere erişilemediğinden biraz daha küçük bayt kodu ile sonuçlanabilir this
. Hızda herhangi bir fark yarattığını sanmıyorum (ve eğer olsaydı, genel olarak bir fark yaratmak için çok küçük olurdu).
Onları statik hale getirirdim, çünkü genellikle mümkünse yaparım. Ama bu sadece benim.
DÜZENLEME: Bu yanıt, muhtemelen bayt kodu boyutu hakkındaki asılsız iddia nedeniyle reddediliyor. Bu yüzden aslında bir test yapacağım.
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);
}
}
Bayt kodu (ile alındı 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
}
Statik yöntemi çağırmak iki bayt kodu (byteops?) Alır: iconst_0
(bağımsız değişken için) ve invokestatic
.
Statik olmayan yöntemi çağırmak üç zaman alır: aload_1
( TestBytecodeSize
sanırım nesne için ), iconst_0
(argüman için) ve invokespecial
. (Bunlar özel yöntemler olmasaydı, invokevirtual
bunun yerine olurdu invokespecial
; bkz. JLS §7.7 Çağırma Yöntemleri .)
Şimdi, dediğim gibi, bu iki arasında performans açısından büyük bir fark olmasını beklemiyorum invokestatic
. invokestatic
ve invokespecial
her ikisi de biraz daha hızlı olmalı invokevirtual
, çünkü ikisi de dinamik yerine statik bağlamayı kullanıyor, ancak ikisinden de daha hızlı olup olmadığı hakkında hiçbir fikrim yok. İyi referanslar da bulamıyorum. Bulabileceğim yakın olan bu 1997 JavaWorld makale temelde ne dediğimi restates:
En hızlı talimatlar büyük olasılıkla olacaktır invokespecial
ve invokestatic
çünkü bu talimatlar tarafından çağrılan yöntemler statik olarak bağlıdır. JVM bu talimatlar için sembolik referansı çözdüğünde ve doğrudan bir referansla değiştirdiğinde, bu doğrudan referans muhtemelen gerçek bayt kodlarına bir işaretçi içerecektir.
Fakat 1997'den beri birçok şey değişti.
Sonuç olarak ... Sanırım daha önce söylediklerime sadık kalıyorum. En iyisi bir mikro optimizasyon olacağından, hız birbirini seçmenin nedeni olmamalıdır.