2014-04-22 2 views
1

나는 루프에서 반복 다음 코드 줄을 사용하고 있습니다 :현대 Java는 자동 할당을 어떻게 최적화합니까?

Object val; 
while (logic()) 
    val = val == null ? generateObj() : val; 

나는 모든 경우 JVM은이 코드를 최적화하는 방법 궁금? 즉, val != null이라면 JVM은 할당이 자체적으로 돌아가고 나머지 라인은 무시한다는 것을 의미합니까 아니면 val의 참조를 복사하는 데 시간이 걸릴 것입니까?

내가 표준 JRE (6) 및 Windows 7을 제외하고

내 환경에서 JRE 7을 실행하고 있습니다 : 아주 잘 JVM을 최적화하지 않는 경우이 작업을,이 호출을 수행하는 가장 좋은 대안은 무엇인가? 그냥 if (val == null) val = generateObj();?

+6

어떤 이유 (호기심 옆)을 'if (val! = null) val = generateObj();'를 쓰지 않았다. –

+0

아니요, 아니요. 이 질문은 Java가 어떻게 작동하는지에 관한 것입니다."JVM이 최적화하지 않으면 가장 좋은 대안은 무엇이 될까?" –

+3

JVM이 최적화하지 않으면 가장 좋은 옵션은 최적화 부족을 무시하고 인간에게 가장 명확한 코드를 작성하는 것입니다. 로컬 필드에 대한 여분의 쓰기가 실행 시간의 상당 부분을 제외하고 응용 프로그램의 웅장한 계획에서 측정 할 수 있다면 _shocked_ 될 것입니다. – yshavit

답변

1

호기심? 소스 코드가 열려있는 JVM (그 목록은 http://en.wikipedia.org/wiki/Java_Virtual_Machine)을 선택하고 JIT 컴파일러의 디버그 출력을 실행하십시오.

특히 Oracle JVM의 내부 구조 (Windows에서 실행중인 제품)가 오픈 소스로 전환되었는지는 모르겠지만, 엔지니어가 귀하의 질문에 명확하게 답변 해 줄 수 있습니다. 특히, 문제 티켓 (나는 Symbian JVM (이 중 2 개)에 대한 이런 종류의 티켓을 해결하는 데 사용했고이 종류의 물건을 자세히 진단하는 도구가있었습니다).

일반적으로 현대 자바가 무언가를 최적화하는 방법에 대한 일반적인 질문에는 일반적인 간단한 대답이 없습니다. super cool Stack Overflow answer - - 이럴 자세한 내용을 배울 수있는 가장 좋은 방법은 (공부의 흔적 등이 실행 벤치 마크)

당신이 다음이 어떻게 더 나은 코드를 작성하도록 요청하는 경우 하나를 선택하고 그것으로 재생 이동하는 것입니다 당신에게 몇 가지 힌트를 줄 수

EDIT : C 컴파일러에서 Java 코드를 컴파일하기 위해 JDK를 설정하는 가이드가 있습니까? (이상적으로 일식 설정)

예 하나 있어야합니다. 더 큰 소프트웨어 저장소 (수천 개의 파일과 수천에서 수천 개의 코드 줄까지)를 사용하는 것이 일반적으로 희미한 일이 아니며 환경 설정 권한을 얻는 데는 (일부 문서를 포함하여) 며칠이 걸릴 수 있음을 경고하십시오. .

Wikipedia - List of Java virtual machines에는 일부 오픈 소스 JVM이 나열되어 있습니다. Oracle JVM 페이지는 OpenJDK - the The HotSpot Group을 가리키며, 많은 리소스와 가이드를 얻을 수 있지만 개발자가 쉽게 시작할 수 있도록 도움을 줄 수있는 개발자에게 매우 소중합니다. (나는 거의 오년과 상황이 조금 바뀌 었위한 JVM 및 심비안 OS의 사업을 해요로 좀 더 정확한 지침을 제공 할 수 없습니다 ...)

+0

C 컴파일러에서 Java 코드를 컴파일하기 위해 JDK를 설정하는 가이드가 있습니까? (이상적으로는 일식 설정) –

1

Java는 해석 된 언어입니다. Java는 주로 런타임시 최적화됩니다. 생성 된 바이트 코드는 일반적으로 완전히 최적화되지 않습니다. JVM이 바이트 코드를 실행하는 경우에만 코드가 실행되는 방식에 따라 최적화가 시작됩니다. 따라서 루프가 몇 번 실행되는 경우 JVM이 최적화하지 않을 수도 있습니다. JVM이 무언가를 최적화 할 것인지 여부는 절대로 말할 수 없습니다. 또한 구체적인 JVM 구현에 따라 달라집니다. 그래서 당신은 그것에 의존해서는 안됩니다.

+2

자바 바이트 코드가 해석되지 않고 [JIT가 기계어로 컴파일 됨]이라는 점에 유의할 필요가 없습니다. (http://stackoverflow.com/questions/1326071/is-java-a-compiled-or-an-interpreted-programming -language) –

+0

컴파일러는 JVM이 바이트 코드를보기 전에 충분히 최적화 할 수 있습니다. – chrylis

+0

@chrylis 사실, javac은 그것들을 많이 만들지 않습니다. – EJP

관련 문제