2011-12-09 4 views
0

테스트 목적으로 .class 파일을 생성하기 위해 각 코드를 컴파일 할 때 특정 메서드가 인라인되지 않도록해야합니다.Java 컴파일러에서 메서드가 인라인되지 않도록하는 방법은 무엇입니까?

Eclipse에서 어떻게합니까? 그들이 방법 얘기하기 전에 정말 이유을 알 필요가 사람들을 위해

편집

, 여기에 설명이다 - 나는 검사하고 JVM 바이트 코드를 조작하는 코드를 테스트하고있다. 그래서 때때로 메소드 인라이닝을 피하기를 원합니다.

+0

테스트에 어떤 영향을 줍니까? 기능상 차이가없는 경우에만 코드가 인라인됩니다. 당신이 볼 수있는 유일한 차이점은 성능입니다. 성능 테스트를 위해 프로덕션 환경에서와 똑같이 코드를 처리해야합니다. 그렇지 않으면 테스트가 유용하지 않습니다. –

+0

질문을 수정했습니다. – mark

+0

"방법"에 대한 응답으로 "왜"라는 질문을받을 때; 그것은 일반적으로 "우리는 모르지만, 우리가 조금 더 많은 배경을 제공한다면 우리는 여전히 도울 수있을 것"이라고 추측합니다. –

답변

1

Java 메소드는 .class 파일을 생성 할 때 (런타임시 최적화 된 JVM에서만) 인라인되지 않으므로 걱정할 필요가 없습니다.

+0

사실, 참조가 있으십니까? Java 사양 또는 그와 비슷한 것? – mark

+0

@mark : JLS 또는 JVM 사양의 어딘가에서 최근에 읽은 것처럼 느껴지지만 다시 검색하면 찾을 수 없습니다. 나는 클래스 파일에있는 보장 된 메소드 인 뿐만 아니라 소스에 있던 순서와 같아야한다는 모호한 생각을했습니다. - 아니요, 이니셜 라이저 블록 *입니다. 작동하려면 [Class.getDeclaredMethods] (http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredMethods%28%29) 이상 있어야합니다. – Boann

+0

@mark : 인라인 메소드의 바이트 코드 라기보다는 다른 메소드를 인 코드 할 수있는 메소드의 바이트 코드에 관심이 있다면, 그것이 의미하는 바가 아닐 수도 있다는 것을 깨달았습니다. 나는 그것에 대해 공식적인 보장이 있다고 생각하지 않는다. uninlined code present를 남기면 컴파일러가 일을 올바르게 인라인 할 수있는 것처럼 보입니다. 그러나 표준 javac은 'private static final'이라 할지라도 메소드를 인라이닝하지 않습니다. 원시 소스의 게으르고 게으른 전환입니다. – Boann

4

그렇지 않습니다. 컴파일러와 JIT가 바이트 코드를 최적화하는 방법을 거의 통제 할 수 없습니다.

내가 왜 이렇게하고 싶은지 확실하지 않습니다.

HotSpot의 -XX:MaxInlineSize=은 매우 낮은 수로 설정되어 메소드가 인라인되지 않음을 의미하는 다양한 JVM 구현이 미세 조정을 허용 할 수 있습니다. 이클립스 컴파일러에는 동일한 옵션이있을 수 있지만 조심해야합니다.

+0

JIT는 Java 바이트 코드를 컴퓨터 코드로 컴파일합니다. – mark

+0

@markal 나는 실제로 JIT 컴파일이 무엇인지 알고있다. 컴파일러와 JIT가 바이트 코드를 최적화하는 방법을 거의 제어 할 수 없으며 초기 바이트 코드 출력을 제어하는 ​​신뢰할 수있는 크로스 컴파일러 방식이나 이후의 최적화 방법을 알지 못합니다. –

+0

Boann (내가 표시 한)이 제공 한 대답이 잘못되었다고 말하고 싶습니까? – mark

-1

자바 인라인 함수에 관해서라면, 당신은 전적으로 컴파일러의 희롱에 빠져있다. 당신은 그것에 대해 아무 말도하지 않습니다.

인라인해야하는지 여부를 결정하는 데 사용되는 다양한 메트릭이 있습니다. 나는 이들 중 하나가 메소드의 바이트 코드 명령어의 수라고 생각한다. 이 같은 방법이 있다면 그래서 :

void foo() { 
    if(SOME_GLOBAL_BOOLEAN_THATS_ALWAYS_FALSE) { 
     // lots of statements here 
    } 
    // code here 
} 

당신은 당신에 인라인의 가능성을 줄일 수있을를, 문은 반드시 그것을 최적화하지 않을했다 할 경우 당신이 충분히 영리했다 제공 너 한테.

+1

실제로 현대 JIT 컴파일러는 전역을 true로 설정하는 코드가 없다는 사실을 감지하고 실제로 해당 코드를 컴파일합니다. 그 값을 변경하기 위해 나중에 어떤 클래스가로드되면 자바는 최적화를 제거 할 수있다. 자바 6을 좋아해. –

+0

@couling; 그것은 "당신이 충분히 영리했다"는 부분입니다. – corsiKa

관련 문제