는 나는 그것이 for loop
의 인덱스 변수를 수정하는 나쁜 습관이다 그 학교에 들었다JVM 옵션이
for(int i = 0 ; i < limit ; i++){
if(something){
i+=2; //bad
}
if(something){
limit+=2; //bad
}
}
인수했다을 일부 컴파일러 그 최적화는 루프을 최적화 할 수 있으며 각 루프에서 인덱스와 바운드를 다시 계산하지 않습니다.
나는 java
에서 약간의 테스트를했으며, 기본적으로 인덱스와 바운드가 매번 다시 계산되는 것으로 보입니다.
JVM HotSpot
에서 이런 종류의 기능을 활성화 할 수 있는지 궁금합니다. 작성하지 않고도
for(int i = 0 ; i < foo.getLength() ; i++){ }
: 예를 들어
루프 이런 종류의 최적화
int length = foo.getLength()
for(int i = 0 ; i < length ; i++){ }
그것은 내가 시도하고 improvments을보고 궁금해서 그냥 예입니다.
편집
피터 Lawrey에 따르면 왜이 간단한 예에서 JVM이 getLenght()
방법을 인라인하지 않는 대답? :
public static void main(String[] args) {
Too t = new Too();
for(int j=0; j<t.getLength();j++){
}
}
class Too {
int l = 10;
public Too() {
}
public int getLength(){
//System.out.println("test");
return l;
}
}
"test"출력은 10 회 인쇄됩니다.
나는 이런 종류의 실행을 최적화하는 것이 좋을 것이라고 생각한다.
편집 2 : 내가 오해를 만든 것 같은데 ...
은 내가 println
를 제거해야하고 실제로 프로파일 러는 방법 getLength()
은이 경우에도 한 번 호출되지 않는다는 것을 말해.
* 인라인이 무엇인지 오해하는 것 같습니다. 모든 컴파일러 최적화의 101은 생성 된 코드가 JLS가 요구하는 동작과 기능적으로 동일 할 수 있다는 것입니다. 즉, 함수 호출을 인라인 할 수는 있지만'println()'호출을 제거 할 수는 없습니다. 또한 그러한 컴파일러 최적화에 대해 정말로 걱정하지 않아야합니다. 그렇지 않으면 적어도 이런 종류의 코드를 테스트하는 방법을 충분히 이해해야합니다. – Voo
좋아, 나는 그걸 몰랐고, 나는 아주 새롭고 여전히 많은 것을 배웠다. 이런 종류의 "진보?" 지식은 (나의) 학교에서 unteach에 머물러 있기 때문에 혼자서 이해하려고 노력하며 종종 실수를합니다. : –
무료 였고 실제로 코드를 자세하게 살펴 보았습니다 - 곧 귀하의 질문에 대한 답변을 드리겠습니다 : JIT는'getLength()'println() 문을 거기에 넣었는지 아닌지를 독립적으로 정의 할 수 있습니다. 세부 사항을 원한다면 아래에 짧은 요약을 게시;) – Voo