Potrebbe comportare un bytecode leggermente più piccolo, poiché i metodi statici non avranno accesso a this
. Non penso che faccia alcuna differenza di velocità (e se lo facesse, probabilmente sarebbe troppo piccolo per fare la differenza nel complesso).
Li renderei statici, dal momento che generalmente lo faccio se possibile. Ma sono solo io.
EDIT: questa risposta continua a essere sottovalutata, probabilmente a causa dell'asserzione non comprovata sulla dimensione del bytecode. Quindi eseguirò effettivamente un test.
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 (recuperato con 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
}
Il richiamo del metodo statico richiede due bytecode (byteops?): iconst_0
(Per l'argomento) e invokestatic
.
Richiamare il metodo non statico richiede tre: aload_1
(per l' TestBytecodeSize
oggetto, suppongo), iconst_0
(per l'argomento) e invokespecial
. (Nota che se questi non fossero stati metodi privati, sarebbe stato invokevirtual
invece di invokespecial
; vedi JLS §7.7 Metodi di invocazione .)
Ora, come ho detto, non mi aspetto che ci sia una grande differenza nelle prestazioni tra questi due, oltre al fatto che invokestatic
richiede un bytecode in meno. invokestatic
e invokespecial
dovrebbero essere entrambi leggermente più veloci di invokevirtual
, poiché entrambi usano il binding statico anziché dinamico, ma non ho idea se uno dei due sia più veloce dell'altro. Non riesco a trovare buoni riferimenti neanche. Il più vicino che riesco a trovare è questo articolo JavaWorld del 1997 , che sostanzialmente ribadisce ciò che ho appena detto:
Molto probabilmente saranno le istruzioni più veloci invokespecial
e invokestatic
, poiché i metodi invocati da queste istruzioni sono associati staticamente. Quando la JVM risolve il riferimento simbolico per queste istruzioni e lo sostituisce con un riferimento diretto, tale riferimento diretto probabilmente includerà un puntatore ai bytecode effettivi.
Ma molte cose sono cambiate dal 1997.
Quindi, in conclusione ... Immagino di essere ancora fedele a quello che ho detto prima. La velocità non dovrebbe essere la ragione per scegliere l'una rispetto all'altra, poiché sarebbe al massimo una micro-ottimizzazione.