Це може призвести до трохи меншого байт-коду, оскільки статичні методи не отримають доступ до них this
. Я не думаю, що це має велику різницю у швидкості (і якби це було, то, ймовірно, це буде занадто мало, щоб змінити загальну зміну).
Я зробив би їх статичними, оскільки, як правило, роблю це, якщо це можливо. Але це тільки я.
EDIT: Ця відповідь не змінюється, можливо, через необґрунтоване твердження про розмір байтового коду. Тож я фактично проведу тест.
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
}
Викликання статичного методу займає два байт-коди (проміжки часу): iconst_0
(для аргументу) та invokestatic
.
Викликання нестатичного методу займає три: aload_1
(для TestBytecodeSize
об'єкта, я думаю), iconst_0
(для аргументу) та invokespecial
. (Зауважте, що якби це не були приватні методи, це було б invokevirtual
замість них invokespecial
; див. JLS §7.7 Методи виклику .)
Тепер, як я вже сказав, я не сподіваюся, що між цими двома різними показниками ефективності між цими двома, окрім того, що invokestatic
потрібно один менший байт-код , я не очікую . invokestatic
і invokespecial
обидва повинні бути трохи швидшими invokevirtual
, оскільки вони обидва використовують статичну прив'язку замість динамічної, але я не маю уявлення, чи то інший швидший за інший. Я не можу знайти жодних хороших посилань. Найближче, що я можу знайти, - це стаття JavaWorld 1997 року , яка в основному повторює те, що я щойно сказав:
Швидкіші інструкції, швидше за все, будуть invokespecial
і invokestatic
тому, що методи, на які посилаються ці інструкції, статично пов'язані. Коли JVM вирішить символічне посилання на ці вказівки і замінить його прямим посиланням, це пряме посилання, ймовірно, буде включати вказівник на фактичні байт-коди.
Але багато речей змінилося з 1997 року.
Отже, на закінчення ... Я думаю, я все ще дотримуюся того, що я говорив раніше. Швидкість не повинна бути причиною вибору одного за іншим, оскільки це була б оптимізація в кращому випадку.