2012-01-18 55 views
6

我正在開發類似於Scheme的語言的編譯器,並正在閱讀Dybvig的論文。在那裏,他說通過在棧上而不是在堆上分配調用幀來實現他的大部分性能提升。有幾個技巧需要完成才能在閉包和連續存在的情況下實際完成這項工作。什麼使基於堆的方案比基於堆棧的方案慢?

我的問題是這種性能增益來自哪裏?純粹是因爲我們減少了垃圾收集器的負擔嗎?

換言之:假設我們有無限量的內存,堆棧分配的調用幀仍然比堆分配的調用幀更快嗎?

+0

你提到「垃圾收集器」 - 你的實現語言是什麼? – 2012-01-18 18:20:57

+0

我的實現語言是C.但我應該澄清,我的意思是編譯代碼的性能增益,*而不是*編譯器本身的性能增益。 – 2012-01-18 20:58:28

+4

注意一個答案,但是:(a)處理堆需要更多的時間,因爲它需要掃描它(它不像線性堆棧); (b)幾乎所有的cpu體系結構都特別強調儘可能快地訪問堆棧,而堆棧也不例外。 – 2012-01-18 23:12:07

回答

4

我認爲Eli回答了你的問題,所以我要在這裏粘貼他的評論並獲得讚譽:)。

禮Barzilay寫道:

(a)中處理的堆花費更多的時間,因爲它需要掃描它(它不是像堆疊線性); (b)幾乎所有的cpu體系結構都特別強調儘可能快地訪問堆棧,而不是堆棧。

爲此,我將添加關於緩存局部性的一般手勢。也就是說,一個堆棧將所有的行爲都保存在內存的一小部分中,這幾乎肯定會留在緩存中。

+0

你讓我揮舞手中的一部分...... – 2012-01-19 18:48:10

+0

我還會補充說堆棧上的垃圾收集與收集堆相比非常便宜(彈出幀)。 – eljenso 2012-01-24 11:49:05

0

Appel寫了一個paper聲稱堆分配可以比堆棧分配更快。在數學上他是正確的,但是他忽略了現代處理器如何適應運行使用棧的代碼(緩存局部性,高效的堆棧指令等)以及堆訪問具有更多的間接性(在現代CPU中不好)。