바이트 코드 분석을 사용하거나 System.nanoTime
을 사용하여 두 가지 접근 방식을 사용하십시오. 나는 두 번째 것이 빠르다고 생각한다. 여기에 나는이 결론 짓입니다 :
public static class A {
public B b = new B();
}
public static class B {
public E e = new E();
}
public static class E {
public String name = "s";
public int age = 1;
}
그런 다음 나는 두 가지 간단한 방법을 쓰고
javap -c CLASS_NAME
를 사용하여 자바 바이트 코드를 얻을 : 아래로
나는 세 가지 클래스를 썼다.
public static void Test1() {
A a = new A();
String str = a.b.e.name;
int age = a.b.e.age;
}
위의 방법의 바이트 코드는 다음과 같습니다
public static void Test1();
Code:
// new A();
0: new #15
3: dup
4: invokespecial #17
7: astore_0
8: aload_0
// a.b (it accesses the field and put it on operand stack)
9: getfield #18
// b.e
12: getfield #22
// b.name
15: getfield #28
// pop 'name' from stack
18: astore_1
19: aload_0
// cyle continues
20: getfield #18
23: getfield #22
26: getfield #34
29: istore_2
30: return
당신은, 바이트 코드 수준에서이 필드를 사용할 때마다 명확하게 볼 수 있습니다, 그것은 그 값을 넣어 스택에 제출하고 이주기는 계속됩니다. 따라서 a.a1.a2....an
은 스택에 모두 n
을 보유하기에 충분한 양의 스페이서가있는 경우 n
명령어가됩니다. 그리고 컴파일러는이 같은 사이클을 호출하여 name
과 age
필드에 모두 액세스했습니다. 인 상기 방법
public static void Test2() {
A a = new A();
E e = a.b.e;
String str = e.name;
int age = e.age;
}
바이트 코드 : 그것은 getfield
의 실행을 방지로서
public static void Test2();
Code:
// new A();
0: new #15
3: dup
4: invokespecial #17
7: astore_0
8: aload_0
// store a.b.e on operand stack once
9: getfield #18
12: getfield #22
15: astore_1
16: aload_1
// get 'name' field
17: getfield #28
20: astore_2
21: aload_1
// get 'age' field
22: getfield #34
25: istore_3
26: return
위의 이전 코드보다 4 명령 짧은
이제 여기에서 두 번째 방법이다. 그래서 이전의 것보다 더 빠르다고 생각합니다.
찾고있는 단어가 '연결됨'입니다. 중첩은 다른 사람의 컨텍스트 내에서 하나의 일이 발생하고 있음을 의미합니다. – Perception