dhseo89   5년 전

안녕하세요

재귀를 써서 dp를 만들었는데요

제가 첨부한 소스에 주석된 부분이 원래 부분인데 저렇게 하면 속도가 10배도 더 나오네요...

Math.min 으로 비교할떄와 if로 비교하여 할때랑 뭔가 큰 차이가 있는건가요...?

고수분들 알려주세요 ㅜㅜ

chogahui05   5년 전

굉장히 재미있고, 흥미로운 질문인 듯 싶네요.

제가 몇 가지 실험을 해 보았습니다.

(1) if(dp[n]>save) dp[n] = save

240MS


(2) dp[n] = ((dp[n]<save)?dp[n]:save);

250MS


(3) Main 함수 내에 static my_min 함수 호출

380MS

(4) Calc 클래스 내에 min 메서드를 넣어놓고, Calc 인스턴스를 만든 다음에 Calc 인스턴스.min 호출

408MS


(5) Buffered 계열을 안 쓰고, Scanner 계열을 쓴 다음에, Math.min 함수 호출

3244MS


(6) Buffered 계열을 쓰고, Math.min 함수 호출

3388MS

chogahui05   5년 전

함수가 호출이 되면, 스택에 쌓인다고 하는데. 그 과정을 대략적으로 보면

(1) 현재 수행하고 있는 명령어의 위치를 어딘가에 저장한다. 이를 복귀 주소라고 한다.

(2) 함수가 있는 위치로 JUMP 한다.

(3) 특정 함수를 수행

(4) 함수가 끝나면 스택에서 정리 (stack POP)

(5) 다시 복귀 주소로 Return

가 됩니다. 일단, 함수를 추가로 호출한 쪽이, 그렇지 않은 쪽보다 시간이 1.5배 가량 길게 나온 건 이 때문인 걸로 보이는데..

(아무래도 분기를 상대적으로 더 많이 하기 때문이 아닌가 싶습니다.)

그래도 10배까지 차이날 정도는 아니였어요. 

STACK overflow에도 그렇게 이야기를 하더라고요. 그래서 의아했는데..


아마 제가 보았을 때에는

함수가 있는 위치로 JUMP를 하고, 다시 복귀주소로 Return을 하는데

그 차이가 워낙 커서 그러지 않았나 싶기도 하네요. 제가 할 수 있는 의심은 그 정도네요..


추가적인 정보를 찾고 싶으시다면 JVM 메모리 내부 구조를 알아보심 도움이 될 거 같습니다.

굉장히 좋은 질문인데

이 정도밖에 답변 못 해드리는 건 너무 죄송합니다..

chogahui05   5년 전

+ 재귀 호출을 하지 않고 그냥 Math.min을 호출하면 108MS에 통과합니다.

함수 호출 오버헤드가 크다고 하더라도.. 저렇게까지 큰 지는 의문이네요. 흐음..

dhseo89   5년 전

저도 도저히 모르겠어서 그냥 if로 하는게 좋겠구나 생각했는데...

언젠가 찾아내겠습니다...

답변 모두 감사드려요~~~

댓글을 작성하려면 로그인해야 합니다.