2016-07-07 3 views
-1

더 빠른 Foo.b 또는 Foo.c 중 어느 것입니까?캐싱 된 게터 성능

public class Foo{ 
    int a = 0; 
    public int b(){ 
     if(a == 0){ 
      return a = 1; 
     } 
     return a; 
    } 
    public int c(){ 
     if(a == 0){ 
      a = 1; 
     } 
     return a; 
    } 
} 

분해 된 바이트 코드 :

public int b();                                              
    Code:                                                
     0: aload_0                                              
     1: getfield  #2     // Field a:I                                    
     4: ifne   14                                            
     7: aload_0                                              
     8: iconst_1                                              
     9: dup_x1                                              
     10: putfield  #2     // Field a:I                                    
     13: ireturn                                              
     14: aload_0                                              
     15: getfield  #2     // Field a:I                                    
     18: ireturn                                              

    public int c();                                              
    Code:                                                
     0: aload_0                                              
     1: getfield  #2     // Field a:I                                    
     4: ifne   12                                            
     7: aload_0                                              
     8: iconst_1                                              
     9: putfield  #2     // Field a:I                                    
     12: aload_0                                              
     13: getfield  #2     // Field a:I                                    
     16: ireturn                                              
}                                                  

이 foo.c를()가 추가 getfield을 가지고 보이지만 Foo.b()도 추가 운영하고있다. 바이트 코드 수준

+3

어쩌면 당신이 일년 내내 그것을 실행하면 차이점을 발견 할 것입니다; D –

+2

가장 읽기 쉬운 것은 확실히 두 번째 것입니다. 그래서 그걸 사용해야합니다. –

+2

JIT가 수행 한 작업이 모두 수행 된 후에는 아무런 차이가 없을 것입니다. – Andreas

답변

1

차이는에있는 경우, 블록

7: aload_0   "Start of if {" 
8: iconst_1   
9: dup_x1    
10: putfield  #2 
13: ireturn  "End of if } and method execution"  

7: aload_0   "Start of if {" 
8: iconst_1   
9: putfield  #2"End of if }, but not end of execution" 

실행 연산의 양이 동일한 상관없이 촬영 한 지점 그래서 유일한 차이는 약간의 "낭비"바이트 코드없는 여전히. 실제 상황에서는 이것이 성능 문제가 아니라 코드 스타일 문제입니다.

0

루프를 반복하면서 수백만 번 반복하는 코드에서이 코드를 호출하지 않는 한이 두 가지 접근 방식의 차이점은 학문적으로 만 발생하며 시스템의 전반적인 성능에는 큰 영향을 미치지 않습니다. 디스크 또는 네트워크 I/O와 유사합니다.

+0

캐싱 값의 본질은 처음부터 if 블록이 실행되지 않고 if 블록에서만 유일한 차이점이 있다는 것을 깨달았습니다. 나는 또한 그것이 그 후에도 전화에 영향을 미친다고 실수로 생각했다. 후속 통화에서 성능에있어 ** 학업 ** 차이점은 없었 겠지? – SOFe

+0

그리고 예, 그 차이가 매우 미미하다는 것을 알고 있습니다 (조기 최적화). 나는 OCD가 매번'return '을 추가 할 것인지에 대해 고심하고 있기 때문에이 질문을 던졌고, 지금 당장이 질문에 대한 _academic_ 답변이 없다는 것을 알게되었습니다. – SOFe