2012-01-18 2 views
6

저는 Scheme과 비슷한 언어 용 컴파일러를 개발 중이며 Dybvig의 논문을 읽고 있습니다. 그것에서 그는 콜 프레임을 힙이 아닌 스택에 할당함으로써 성능 향상의 대부분을 달성했다고 말합니다. 클로저와 연속성이있는 상태에서 실제로이 작업을 수행하려면 여러 가지 트릭이 필요합니다.스택 기반 Scheme보다 힙 기반 Scheme을 느리게 만드는 이유는 무엇입니까?

제 질문은이 성능 향상이 어디에서 발생했는지입니다. 우리가 가비지 컬렉터에 부담을 덜주기 때문에 순수한 것입니까?

다른 방식으로 말하자면 : 무한 메모리가 있다고 가정하면, 할당 된 콜 프레임을 쌓아 올리면 여전히 힙 할당 된 콜 프레임보다 빠릅니까?

+0

"가비지 수집기"에 대해 언급합니다. 구현 언어는 무엇입니까? –

+0

구현 언어는 C입니다.하지만 컴파일러 코드 자체의 성능 향상이 아니라 컴파일 된 코드의 성능 향상이라는 것을 분명히해야합니다. –

+4

정말로 대답이지만 (a) 힙을 다루는 것은 스캔이 필요하기 때문에 더 많은 시간이 걸립니다 (스택과 같이 선형이 아닙니다). (b) 실제로 모든 CPU 아키텍처는 가능한 한 빨리 스택 액세스를 만드는 데 중점을두고 있으며 힙을 사용하지는 않습니다. –

답변

4

저는 엘리가 당신의 질문에 대답했다고 생각합니다. 그래서 나는 그의 코멘트를 여기에 붙여 넣을 것입니다. :).

엘리 바질 레이는 기록 :

이 그것을 스캔 필요로하기 때문에 (가) 힙 처리 시간이 더 소요

(이것은 스택처럼 선형 아니에요) (b) 거의 모든 cpu 아키텍처는 가능한 한 빨리 스택 액세스를 만드는 데 중점을두고 있으며 힙은 그렇지 않습니다.

여기에 캐시 위치에 대한 일반적인 설명이 추가됩니다. 즉, 스택은 모든 동작을 메모리의 아주 작은 부분에 유지하므로 거의 확실하게 캐시에 남습니다.

+0

당신은 손을 흔들면서 손을 잡았습니다 ... –

+0

스택에 가비지 콜렉션을 추가하는 것은 힙 수집과 비교하여 매우 저렴합니다. – eljenso

0

Appel은 힙 할당이 스택 할당보다 빠를 수 있다고 주장하는 paper을 작성했습니다. 수학적으로 그는 맞지만 그는 현대 프로세서가 스택 (캐시 위치, 효율적인 스택 명령어 등)을 사용하는 실행 코드와 힙 액세스에 더 많은 방향성 (현대 CPU에서는 좋지 않음)이 어떻게 적용되는지를 무시합니다.

관련 문제