Це може призвести до трохи меншого байт-коду, оскільки статичні методи не отримають доступ до них 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 року.
Отже, на закінчення ... Я думаю, я все ще дотримуюся того, що я говорив раніше. Швидкість не повинна бути причиною вибору одного за іншим, оскільки це була б оптимізація в кращому випадку.