2012-09-13 39 views
19

Liên quan đến câu hỏi khác của tôi Haskell collections with guaranteed worst-case bounds for every single operation?, tôi tò mò: Thời gian tạm dừng có thể được gây ra bởi việc thu gom rác thải?Thời gian tạm dừng có thể xảy ra trong chương trình Haskell do thu gom rác thải như thế nào?

Haskell có sử dụng một số loại thu gom rác gia tăng để chương trình bị dừng chỉ trong một thời gian ngắn hoặc có thể dừng trong vài giây trong trường hợp cực đoan không?

Tôi tìm thấy hai giấy tờ của SPJ về chủ đề: https://research.microsoft.com/en-us/um/people/simonpj/papers/non-stop/index.htm. Nhưng tôi không tìm thấy một tham chiếu nếu những ý tưởng này thực sự được áp dụng bởi GHC (hoặc các triển khai Haskell khác).

+4

Lưu ý rằng trên lý thuyết có nhiều nguyên nhân gây chậm trễ không thể đoán trước được trong hoạt động của chương trình. Chúng bao gồm những thứ như phân trang bộ nhớ ảo và các công tắc ngữ cảnh được thực hiện bởi hệ điều hành. Những điều này áp dụng cho tất cả các ngôn ngữ, ngay cả những ngôn ngữ không sử dụng thu gom rác tự động. Về lý thuyết, chúng có thể chèn trễ giữa bất kỳ hoạt động nào của bất kỳ chương trình nào, với * không đảm bảo * có độ dài trễ tối đa. Trong thực tế, chúng hiếm khi là một vấn đề mà bạn phải đối phó trong lập trình "bình thường". Độ trễ GC là như nhau. – Ben

Trả lời

24

GHC được thiết kế cho thông lượng tính toán, không phải độ trễ. Do đó, GHC sử dụng một bộ thu gom rác generational, multi-threadedwith thread-local heaps. Bộ sưu tập rác của các đối tượng địa phương không ngăn các chủ đề khác. Các GC chính thường xuyên của đống toàn cầu sẽ tạm dừng tất cả các chủ đề.

Thông thường các lần tạm dừng nằm trong số lượng nhỏ mili giây, hwoever không có sự đảm bảo về độ trễ.

Bạn có thể kiểm soát tần suất GC qua several runtime flags (ví dụ: gc -I khoảng thời gian).

+3

Tôi khá chắc chắn rằng các công cụ đống địa phương không thực sự nằm trong đường chính. Simon Marlow cho biết nó làm cho GC phức tạp hơn nhiều trong khi không cải thiện hiệu suất GC nhiều. Vì vậy, câu trả lời sửa đổi là: tất cả các GC gây ra tạm dừng (thường là khá ngắn) và các GC chính được thực hiện song song. Thời gian tạm dừng thực tế phụ thuộc rất nhiều vào kích thước heap. '+ RTS -s' thực sự in thời gian tạm dừng, vì vậy thật dễ dàng để tìm ra. – nominolo

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