누구나 다음과 같은 재귀 메서드가 반복적 인 것보다 빠르다는 이유를 설명 할 수 있습니까? (모두 문자열 연결을 수행하고 있습니다)? 반복적 인 접근법이 재귀 적 접근법을 깨뜨리는 것이 아닌가? 더하기 각 재귀 호출 스택의 맨 위에 새로운 공간을 비효율적으로 만들 수있는 새로운 레이어를 추가합니다.자바 반복 대 재귀
private static void string_concat(StringBuilder sb, int count){
if(count >= 9999) return;
string_concat(sb.append(count), count+1);
}
public static void main(String [] arg){
long s = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 9999; i++){
sb.append(i);
}
System.out.println(System.currentTimeMillis()-s);
s = System.currentTimeMillis();
string_concat(new StringBuilder(),0);
System.out.println(System.currentTimeMillis()-s);
}
프로그램을 여러 번 실행했지만 반복적 인 프로그램은 항상 반복적 인 프로그램보다 3-4 배 빠릅니다. 반복적 인 것을 더 느리게하는 주된 이유는 무엇일까요?
올바르게 마이크로 벤치 마크하는 법을 배우십시오. 당신은 두 시간 동안 많은 반복을해야하고, 당신의 시간을 평균화해야합니다. 그 외에도, VM이 첫 번째 컴파일 링을하지 않으면 두 번째로 불공정 한 이점을주지 못하게해야합니다. – oldrinb
또한 순서를 변경하고 루프에서 전체 테스트를 적어도 다섯 번 반복합니다 (예 : 웜업을 위해 처음 두 개를 버림). System.nanoTime – Thilo
사실, 기본 HotSpot 컴파일 임계 값 ('-XX : CompileThreshold'를 통해 구성 가능) 10,000 호출이며 여기에서 볼 수있는 재진입을 설명 할 수 있습니다. HotSpot은 꼬리 최적화를 실제로 수행하지 않으므로 재귀 솔루션이 더 빠르다는 것이 이상합니다. – oldrinb