2012-01-18 32 views
6

Tôi đang phát triển một trình biên dịch cho một ngôn ngữ tương tự như Đề án, và đang đọc qua luận án của Dybvig. Trong đó, ông nói rằng đạt được hầu hết hiệu suất của mình đạt được bằng cách phân bổ các khung gọi trên stack thay vì trên đống. Có một số thủ thuật cần phải được thực hiện để thực sự làm cho công việc này trong sự hiện diện của đóng cửa và tiếp tục.Điều gì làm cho một lược đồ dựa trên heap chậm hơn một lược đồ dựa trên stack?

Câu hỏi của tôi là hiệu suất này đến từ đâu? Nó hoàn toàn là vì chúng tôi đặt ít căng thẳng vào bộ thu gom rác?

Đặt một cách khác: Giả sử chúng tôi có số lượng bộ nhớ vô hạn, các khung cuộc gọi được phân bổ sẽ vẫn nhanh hơn khung cuộc gọi được phân bổ heap?

+0

Bạn đề cập đến "bộ thu gom rác" - ngôn ngữ triển khai của bạn là gì? –

+0

Ngôn ngữ thực hiện của tôi là C. Nhưng tôi nên làm rõ, tôi có nghĩa là đạt được hiệu suất cho mã được biên dịch, * không * đạt được hiệu suất cho trình biên dịch. –

+4

Lưu ý thực sự là một câu trả lời nhưng: (a) đối phó với heap mất nhiều thời gian hơn vì nó đòi hỏi phải quét nó (nó không phải là tuyến tính như ngăn xếp); (b) thực tế tất cả các kiến ​​trúc cpu đặt thêm sự nhấn mạnh vào việc truy cập stack nhanh nhất có thể, và không như vậy với heap. –

Trả lời

4

Tôi nghĩ Eli đã trả lời câu hỏi của bạn, vì vậy tôi sẽ dán nhận xét của anh ấy ở đây và nhận tín dụng cho nó :).

Eli Barzilay viết:

(a) đối phó với đống mất nhiều thời gian hơn vì nó đòi hỏi phải quét nó (nó không tuyến tính như stack); (b) thực tế tất cả các kiến ​​trúc cpu đặt trọng tâm hơn vào việc truy cập stack càng nhanh càng tốt, và không phải như vậy với heap.

Để làm điều này, tôi sẽ thêm chung vẫy tay về vị trí bộ nhớ cache. Đó là, một ngăn xếp giữ tất cả các hành động trong một phần rất nhỏ của bộ nhớ, mà hầu như chắc chắn sẽ ở lại trong bộ nhớ cache.

+0

Bạn đã có tôi ở phần vẫy tay ... –

+0

Tôi cũng sẽ thêm bộ sưu tập rác đó vào ngăn xếp rất rẻ (popping frames) so với thu thập một đống. – eljenso

0

Appel đã viết số paper tuyên bố rằng phân bổ đống có thể nhanh hơn phân bổ ngăn xếp. Về mặt toán học, nó là chính xác, nhưng anh ta bỏ qua cách các bộ vi xử lý hiện đại được điều chỉnh để chạy mã có sử dụng ngăn xếp (vùng nhớ đệm, hướng dẫn ngăn xếp hiệu quả, v.v.) và truy cập heap có nhiều indirections (xấu trong CPU hiện đại).

Các vấn đề liên quan