BLOG main image
분류 전체보기 (68)
excel.101 (0)
rewind (9)
(3)
(2)
목공 (3)
(3)
me2day (0)
The Ethereal Void (9)
코드 (14)
귀찮은것 (0)
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
'Recursion'에 해당되는 글 1건
2007. 11. 28. 20:13
뭐 관심이 있는 사람만 관심이 있을 뚱딴지같은 내용.

호출 스택입니다.

오래 전에 지뢰 찾기를 만들어 본적이 있었습니다. 기본적으로 빈 칸을 눌렀을 때, 주변에 연계된 모든 빈 공간이 열리는 부분은 현재 칸을 중심으로 팔방이 빈 공간인지를 조사해가며 열어나가면 되는데, 여기서 재귀 호출을 할 때 게임 영역이 일정 수준 이상이 되면, 스택 오버플로우가 일어나더군요.. 그래서 아래와 같은 테스트 코드를 작성하였습니다.

var sc = 0;
try
{
	(function recursive_stack_test()
	{
		recursive_stack_test(++sc);
	})();		
}
catch (e) 
{
	document.writeln("stack count -> " + sc);
}
 

현재 브라우져에서 위의 테스트를 누르면 결과가 나옵니다.. 몇몇 다른 블로그에서 확인한 결과 값과 조금 씩 다른데 그 현상에 대한 기록을 조사해 보았습니다.

먼저 IE의 경우에는 Eric Lippert에 따르면..
function context에 진입할 때마다 새로운 "activation" frame이 JScript 스택에 쌓이게 된다. 이 JScript 스택은 힙영역에 위치하기 때문에 그다지 문제가 되지 않지만, 이와 동시에 새로운 인터프리터의 사본도 생성되어 시스템 스택영역에 위치하게 되는데, 이는 수 백 바이트 정도를 차지하며, 가용한 시스템 스택의 크기가 1,000,000 Bytes 라고 할 때 순식간에 이 용량을 소비하게 된다..
라고 하였습니다. 직접 실시한 브라우져마다 테스트 결과는
  • Internet Explorer 6 : 900~1200
  • Internet Explorer 7 : 1700~
  • FireFox 2.0.0.4 : 1000 (1001) (!) 고정
  • FireFox 3.0b2pre : 245160 (Wow)
  • Opera 9.24 : 3300+
  • Safari 3.0.4 : 499 (500)
FireFox의 경우 1000 (fencepost 1001)에서 고정되는 현상은 버그질라에 많이 올라와 있습니다. 위에 3.0에 보시면 아시겠지만, 이미 버그 처리되어 수정된 사항입니다.

Safari의 경우 원래 제한이 100(fencepost)이었습니다. 몇몇 웹 어플(gmail 같은..)데서 "Maximum call stack size exceeded" 에러가 버그 리포팅되어 수정된 현재가 500입니다. (근데 이것도 모자르지 않나요?)

기본적으로 FireFox 3.0b2pre를 제외하고는 상황에 따라서는 고정된 재귀 호출 스택 제한을 고려해야 됩니다. 특히 Safari의 경우는 문제가 좀 있죠. :(

참고가 되셨으면 합니다.
반응형
prev"" #1 next