문제

C ++에서는 "인라인"메소드를 선언 할 수 있으며 컴파일러는이를 인라인으로 표시 할 수 있습니다. 내가 이해하는 한 Java에는 그러한 키워드가 없습니다.

JVM이 그렇게하기로 결정하면 인라인이 수행됩니까? 어떻게 든이 결정에 영향을 줄 수 있습니까?

도움이 되었습니까?

해결책

다른 몇 가지 답변은 최종 방법 만 감소 할 수 있다고 제안했습니다. 핫스팟이 재정의되지 않은 한 비정형 메소드를 인화 할 수있을 정도로 똑똑하기 때문에 이것은 사실이 아닙니다. 아직. 메소드를 무시하는 클래스가로드되면 최적화를 취소 할 수 있습니다. 분명히 방법을 최종적으로 만드는 것은 결코 필요하지 않습니다 ...

기본적으로 JVM이 업무를 수행하게하십시오. 당신보다 인라인 어디에서 일을 해야하는지 훨씬 더 좋을 것입니다.

JVM이 좋은 일을하지 않는다고 확신하는 상황이 있습니까? 핫스팟을 사용한다고 가정하면 클라이언트 대신 서버 버전을 사용해 보셨습니까? 그것은 만들 수 있습니다 거대한 차이점.

다른 팁

Java 컴파일러는 (짧은 초기 방법) 인라인을 수행 할 수 있지만 진짜 JIT 컴파일러는 인라인이 수행됩니다. JIT (핫스팟) 컴파일러는 인라인까지도 가상 행동 양식. 그것과 상호 작용하는 가장 좋은 방법은 간단하고 간결한 코드를 작성하는 것입니다. 아마도 반사를 사용하는 코드는 인라인을 허용하지 않을 것입니다.

도움이되기를 바랍니다.

'C ++에서는 "인라인"메소드를 선언 할 수 있으며 컴파일러는이를 인라인으로 표시합니다.'... 또는 그렇지 않습니다. 컴파일러는 기능을 인라인으로 자유롭게 만들 수 있으며 결과에 실제로 영향을 줄 수 없습니다. 컴파일러에 대한 힌트 일뿐입니다.

Java에는 그러한 것이 없습니다. 컴파일러 (그리고 나중에 최적화를 수행하는 동안 VM)는 방법을 '인라인'하기로 결정할 수 있습니다.

주목하십시오 결정적인 방법은 인쇄 될 가능성이 더 큽니다 (컴파일러는 파생 클래스에서 덮어 쓰일 수 있으므로 고정되지 않은 비 결합 방법을 인라인 할 수 없습니다). 최신 VM을 사용하면 런타임에 유사한 최적화를 수행 할 수 있습니다. VM은 유형에 플래그를 지정하여 (유형 확인을 수행 할 수 있음) 코드를 인화합니다. 수표가 실패한 경우에만 원래 최적화되지 않은 다형성 방법 호출로 돌아갑니다.

문제의 방법이 다음과 같은 경우 인라인이 발생할 가능성이 높습니다.

  • 짧은
  • 결정적인
  • 길고 최종적인 방법에 의존하지 않습니다

이것이 JVM이 통화의 영향을 확실하게 할 수있는 유일한 상황이기 때문에.

class A {
    final int foo() { return 3; }
}

이 클래스가 주어지면 foo ()에 대한 전화는 상수 "3"로 대체 될 수 있습니다. 모든 Java1 가상 머신은이 작업을 수행 할 수 있습니다. 결정적인 키워드는 "int foo ()"을 무시하는 서브 클래스를 가질 수 없다고 명시 적으로 지시합니다.

이 메소드를 인화하는 방법은 통화 사이트에서 다음과 같은 이점을 제공합니다.

  • 메소드 호출이 없습니다
  • 동적 파견이 없습니다
  • 값을 일정하게 배치 할 수 있습니다. "a.foo ()+2"는 코드가 실행되지 않으면 5가됩니다.
    실행 시간.

과거에는 프로그래머가 종종 삽입했습니다 결정적인 정확히 이런 이유로 키워드. 또는 인라인을 더 잘 촉진하고 실행 속도를 높이기 위해 많은 작은 방법을 하나의 더 큰 방법으로 결합합니다. 그러나 여러면에서 이러한 기술은 프로그래밍 언어에 내장 된 모듈화 및 재사용 성의 전체 시설을 물리칩니다.

Java Hotspot VM과 같은 Modern JVM은 결정적인. 예어**.

(http://java.sun.com/developer/technicalarticles/networking/hotspot/inlining.html)

인라인 행동을 위해 이것을 읽으십시오.http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++andjava.html

그것은 최종 방법이 상환 될 수 있지만 항상 그런 것은 아닙니다.

예, JVM이 결정하면 가능합니다. 영향을 미치는 방법에는 방법을 정적 또는 최종으로 설정하는 것이 포함됩니다.

물론, 그것에 대한 가장 중요한 것은 방법의 구조가 인라인 친화적이어야한다는 것입니다. 짧은 도움이되지만 가장 중요한 것은 로컬 변수와 매개 변수, 필드가없고 동일한 클래스의 다른 메소드에 대한 최소 메소드 호출 만 사용하면됩니다.

그러나 그러한 최적화를 조기에 조기에 보지 않아야합니다. 실제로 다른 잠재적 최적화를 단락시킬 수 있기 때문에 실제로 상황을 악화시킬 수 있습니다. JVM은 때때로 이러한 힌트없이 메소드가 상환 될 수 있음을 깨닫게됩니다.

정상적인 함수와 최종 함수 (JVM에 의해 인라인이라고 함)를 비교할 때, 나는 그들 사이에 성능 향상이 없다는 것을 알았습니다. 기능 호출의 오버 헤드는 이미 매우 낮을 수 있습니다.

참고 : 성능을 평가하기 위해 상자 흐리기 알고리즘을 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top