Это может привести к немного меньшему байт-коду, так как статические методы не получат доступ к нему this
. Я не думаю, что это имеет какое-либо значение в скорости (и если это произойдет, то, вероятно, оно будет слишком маленьким, чтобы изменить ситуацию в целом).
Я бы сделал их статичными, так как я обычно делаю это, если это вообще возможно. Но это только я.
РЕДАКТИРОВАТЬ: Этот ответ продолжает понижаться, возможно, из-за необоснованного утверждения о размере байт-кода. Так что я на самом деле проведу тест.
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
}
Вызов статического метода занимает два байт-кода (byteops?): iconst_0
(Для аргумента) и invokestatic
.
Вызов нестатического метода занимает три: aload_1
(для TestBytecodeSize
объекта, я полагаю), iconst_0
(для аргумента) и invokespecial
. (Обратите внимание, что если бы это не были частные методы, это было бы invokevirtual
вместо invokespecial
; см. JLS §7.7 Методы вызова .)
Теперь, как я уже сказал, я не ожидаю большой разницы в производительности между этими двумя, за исключением того факта, что invokestatic
требуется на один байт-код меньше. invokestatic
и invokespecial
оба должны быть немного быстрее, чем invokevirtual
, поскольку они оба используют статическое связывание вместо динамического, но я понятия не имею, является ли один из них быстрее, чем другой. Я также не могу найти хорошие ссылки. Самая близкая вещь , которую я могу найти, - это статья JavaWorld 1997 года , которая в основном повторяет то, что я только что сказал:
Самые быстрые инструкции, скорее всего, будут invokespecial
и invokestatic
, потому что методы, вызываемые этими инструкциями, статически связаны. Когда JVM разрешает символическую ссылку для этих инструкций и заменяет ее прямой ссылкой, эта прямая ссылка, вероятно, будет включать указатель на фактические байт-коды.
Но многое изменилось с 1997 года.
Итак, в заключение ... Я думаю, что я все еще придерживаюсь того, что я сказал раньше. Скорость не должна быть причиной выбора одного над другим, поскольку в лучшем случае это будет микрооптимизация.