2016-10-02 7 views
0

더 빠를 이유는 무엇입니까?방법 최적화

public void increment{ 
    synchronized(this){ 
    i++; 
    } 
} 

또는

public synchronized void increment(){ 
    I++; 
} 

겠습니까 방법 인라인은 두 번째 옵션을 개선?

+0

두 코드가 모두 코드이고 코드가 같으면 두 코드가 같습니다. – SMA

+2

바이트 코드를 보셨습니까? – Turing85

+0

네,이 질문은 바이트 코드를 보여줌으로써 만 대답 할 수 있다고 생각합니다. 나는 그것이 확실 할 것이고, 확실한 대답을하지만, 나는 확신 할 수 없다. 또한 JLS가 특정 바이트 코드를 요구하는지 잘 모르겠다. 좋은 대답은 OpenJDK와 오라클의 JDK 모두로 검사 할 것이다. – hyde

답변

1

차이점이 보이지 않거나 눈에 띄지는 않지만 두 번째 예는 빠를 수 있습니다. 왜? Oracle/OpenJDK에서는 메소드가 사용하는 바이트 코드가 적을수록 최적화 될 수 있습니다. 인라인했다.

메소드를 최적화 할 수 있고 이러한 임계 값이 바이트 코드의 바이트 수를 기반으로하는 경우 많은 임계 값이 있습니다. 두 번째 예제에서는 바이트 코드가 적으므로 더 많이 최적화 할 수 있습니다.

이러한 최적화 중 하나는 스레드 로컬 객체에 synchronized을 사용할 수 없게하는 이스케이프 분석입니다. 이렇게하면 훨씬 빨라집니다. 이스케이프 해석의 임계 값은 기본적으로 150 바이트 미만 (인라인 후)입니다. 첫 번째 해결 방법이 150 바이트를 넘는 경우와 두 번째 바이트가 150 바이트 미만인 경우를 볼 수 있습니다.

참고 :

  • 는이 기준에 코드를 작성 너무 사소한 문제에 서로 다른되지 않습니다. 코드 명확성은 훨씬 더 중요합니다.
  • 성능이 중요 할 경우 AtomicInteger와 같은 대안을 사용하면 크기가 훨씬 빨라질 수 있습니다. (드문 경우가 아니더라도 일관되게)
  • BTW AFAIK 동시성 라이브러리는 assert 문을 거의 사용하지 않습니다. 최적화되지 않았기 때문에가 아니라 바이트 코드의 크기로 계산되어 의미에 의해 간접적으로 사용 속도가 느려지므로 어떤 경우에는 코드가 최적이 아닙니다. (이 주장은 참고가 있어야하지만 찾지 못했습니다.)
+1

인라이닝은 바이트 코드 수준에서 실제로 수행됩니까? 어셈블리 수준에서만 실현 된 것 같습니다. –

+0

@MarkoTopolnik 그것은 기계 코드로 변환하기 전에 바이트 코드를 인라인합니다. 바이트 코드는 모든 플랫폼에서 동일하며 JVM 개발자가 잘 이해합니다. 기계어 코드는 CPU 모델과 시간에 따른 변경 사항이 다르므로 소프트웨어 최적화 프로그램이 작동하는 변환이 훨씬 더 어렵습니다. –

+2

내가 현재 찾을 수있는 것은 MaxInlineSize (단일 메서드 및 MaxInlineLevel) 메서드 호출의 깊이를 감싸는 MaxInlineSize입니다. –