정적 메소드는에 액세스 할 수 없으므로 바이트 코드가 약간 작아 질 수 있습니다 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
}
정적 메소드를 호출하려면 두 개의 바이트 코드 (바이트)가 iconst_0
필요합니다 (인수의 경우) 및 invokestatic
.
비 정적 메소드를 호출하려면 aload_1
( TestBytecodeSize
객체의 경우), iconst_0
(인수의 경우) 및 invokespecial
. (이러한 개인 방법 없었다면, 그것은 참고했을 것으로 invokevirtual
대신에 invokespecial
, 참조 JLS §7.7 모드 실행 방법을 .)
내가 말했듯이 invokestatic
바이트 코드가 하나 더 적게 필요한 것 외에는이 두 가지 성능에 큰 차이가 없을 것으로 예상 됩니다. invokestatic
그리고 invokespecial
모두 약간보다 더 빨리해야 invokevirtual
하나가 다른 하나보다 더 빠르게 경우들이 있기 때문에 모두를 사용하는 대신 동적 바인딩 정적,하지만 난 아무 생각이 없다. 좋은 참고 자료도 찾을 수 없습니다. 내가 찾을 수있는 가장 가까운 것은 이 1997 JavaWorld 기사 이며, 기본적으로 방금 말한 내용을 다시 표시합니다.
이러한 명령어로 호출 된 메서드는 정적으로 바인딩되므로 가장 빠른 명령어는 invokespecial
and invokestatic
일 가능성이 높습니다 . JVM이 이러한 명령어에 대한 기호 참조를 해결하고이를 직접 참조로 바꾸면 해당 직접 참조에 실제 바이트 코드에 대한 포인터가 포함됩니다.
그러나 1997 년 이후 많은 것들이 바뀌 었습니다.
결론적으로 ... 나는 여전히 이전에 말한 것을 고수하고있는 것 같습니다. 속도는 최고의 미세 최적화이기 때문에 다른 것을 선택 해야하는 이유가 아닙니다.