source

자바에는 인라인 함수가 있나요?

factcode 2022. 9. 17. 09:47
반응형

자바에는 인라인 함수가 있나요?

자바에 인라인 함수의 개념이 있나요?아니면 대체된 기능이 있나요?있다면 어떻게 사용하나요?난 그걸 들어봤다.public,static그리고.final메서드는 인라인 함수입니다.자체 인라인 함수를 만들 수 있습니까?

Java에서는 최적화는 보통 JVM 수준에서 이루어집니다.런타임에 JVM은 몇 가지 "복잡한" 분석을 수행하여 인라인화할 방법을 결정합니다.인라인에 적극적일 수 있으며, 실제로 Hotspot JVM은 비최종 메서드를 인라인화할 수 있습니다.

Java 컴파일러는 메서드 호출을 거의 인라인화하지 않습니다(JVM은 이 모든 것을 런타임에 실행).인라인 컴파일 시간 상수(예: 최종 정적 원시 값)를 수행합니다.하지만 방법은 아니야.

기타 자원:

  1. 기사:Java HotSpot Performance Engine:메서드 인라이닝

  2. Wiki: OpenJDK에 삽입되어 있습니다.완전히 입력되지 않았지만 유용한 토론 링크가 포함되어 있습니다.

아니요, Java에는 인라인 함수가 없습니다.예, 퍼블릭클래스에 배치되어 있는 경우 코드의 임의의 장소에서 퍼블릭스태틱 메서드를 사용할 수 있습니다.Java 컴파일러는 정적 메서드 또는 최종 메서드에서 인라인 확장을 수행할 수 있지만, 이는 보장되지 않습니다.

일반적으로 이러한 코드 최적화는 자주 사용되는 코드 세그먼트에 대해 컴파일러가 JVM/JIT/HotSpot과 함께 수행합니다.또한 파라미터의 레지스터 선언과 같은 다른 최적화 개념은 Java에서 알 수 없습니다.

최적화는 Java 선언으로 강제할 수 없지만 컴파일러 및 JIT에 의해 수행됩니다.다른 많은 언어에서 이러한 선언은 컴파일러 힌트에 불과합니다(프로세서보다 더 많은 레지스터 파라미터를 선언할 수 있으며 나머지는 무시됩니다).

Java 메서드를 static, final 또는 private로 선언하는 것도 컴파일러에 대한 힌트입니다.쓰셔야 하는데, 주방이 안 돼요.Java의 퍼포먼스는 정적이 아닌 동적입니다.클래스 로딩으로 인해 시스템에 대한 첫 번째 콜이 항상 느립니다.다음 콜은 고속이지만 메모리와 런타임에 따라서는 실행 중인 시스템에서 가장 일반적인 콜이 최적화되므로 실행 시 서버 속도가 빨라질 수 있습니다.

Java에서는 메서드를 인라인화할 것을 수동으로 제안할 수 없습니다.@notnoop이 코멘트에서 말한 것처럼 인라인화는 일반적으로 실행 시 JVM에 의해 수행됩니다.

위에 말씀하신 것은 맞습니다.최종 메서드가 인라인으로 작성되는 경우도 있지만 Java에서 인라인 함수를 명시적으로 작성하는 다른 방법은 없습니다.

jvm에 따라 다르지만 Java에서는 인라인 메서드라고 할 수 있습니다.컴파일 후 메서드의 머신코드가 35바이트 미만일 경우 즉시 인라인 방식으로 전송되며, 메서드의 머신코드가 325바이트 미만일 경우 jvm에 따라 인라인 방식으로 전송될 수 있다.

실생활의 예:

public class Control {
    public static final long EXPIRED_ON = 1386082988202l;
    public static final boolean isExpired() {
        return (System.currentTimeMillis() > EXPIRED_ON);
    }
}

다른 수업에서는 코드가 만료된 경우 종료할 수 있습니다.다른 클래스의 EXPIRED_ON 변수를 참조하면 이 상수는 바이트 코드에 인라인이기 때문에 만료 날짜를 체크하는 코드 내의 모든 위치를 추적하기가 매우 어렵습니다.그러나 다른 클래스가 isExpired() 메서드를 호출하면 실제 메서드가 호출됩니다.즉, 해커는 isExpired 메서드를 항상 false를 반환하는 다른 메서드로 대체할 수 있습니다.

컴파일러가 정적 최종 메서드를 참조하는 모든 클래스에 인라인화하도록 강제하는 것은 매우 좋은 일입니다.이 경우 실행 시 Control 클래스가 필요하지 않으므로 Control 클래스를 포함할 필요도 없습니다.

내 연구에 의하면, 이것은 불가능해요.일부 Odfulator 툴이 이를 수행할 수도 있고 컴파일하기 전에 빌드 프로세스를 수정하여 소스를 편집할 수도 있습니다.

컴파일 중에 컨트롤 클래스의 메서드가 다른 클래스에 인라인으로 배치되어 있는지 여부를 확인하기 위해 클래스 패스에 Control 클래스가 없는 다른 클래스를 실행해 봅니다.

이 회피책은 없는 것 같습니다만, guava 또는 동등한 기능 클래스의 실장을 사용해 주세요.이러한 클래스는 매우 단순하기 때문입니다.

    assert false : new com.google.common.base.Function<Void,String>(){
        @Override public String apply(Void input) {
            //your complex code go here
            return "weird message";
        }}.apply(null);

네, 이것은 복잡한 코드 블록({} 내)을 생성하는 방법을 예시하기 위한 데드 코드입니다.이것에 대한 메서드 AKA inline을 만드는 데 방해가 되지 않는 구체적인 작업을 수행합니다.

Java9에는 "Ahead of Time" 컴파일러가 있어 런타임 대신 컴파일 시 여러 가지 최적화를 수행합니다.이 컴파일러는 인라인처럼 보입니다.

언급URL : https://stackoverflow.com/questions/2096361/are-there-inline-functions-in-java

반응형