module Has (r,p,s) where
import Prelude ((==),Bool(..),otherwise,(||),Eq)
import qualified Data.List as L
filter :: (a -> Bool) -> [a] -> [a]
filter _pred [] = []
filter pred (x:xs)
| pred x = x : filter pred xs
| otherwise = filter pred xs
problem1: filter
này được sao chép từ thư viện GHC
's, nhưng tại sao nó tiêu thụ một số lượng ngày càng tăng của bộ nhớ trong tương phản với nhập trực tiếp filter
, tiêu thụ số lượng bộ nhớ không đổi.Tại sao chức năng nhập khẩu trực tiếp trong GHC khác nhau rất nhiều với chức năng tôi viết với mã nguồn sao chép từ GHC Libraries
elem :: (Eq a) => a -> [a] -> Bool
elem _ [] = False
elem x (y:ys) = x==y || elem x ys
problem2: filter
này được sao chép từ thư viện GHC
's, nhưng tại sao nó tiêu thụ một số lượng ngày càng tăng của bộ nhớ như trực tiếp sử dụng elem
, mà cũng tiêu thụ một số lượng ngày càng tăng của bộ nhớ trái ngược với nhập trực tiếp filter
.
r = L.filter (==1000000000000) [0..]
p = filter (==1000000000000) [0..]
s = 1000000000000 `elem` [0..]
GHC phiên bản: 7.4.2 Hệ điều hành: Ubuntu 12.10 Biên soạn với -O2 để tối ưu hóa
Như trên filter
và elem
'định nghĩa của hàm ý cả p = filter (==1000000000000) [0..]
và s = 1000000000000 `elem` [0..]
' s [0..]
nên được thu gom rác thải dần. Nhưng cả hai p
và s
tiêu thụ một số lượng ngày càng tăng của bộ nhớ. Và r
được xác định bằng nhập trực tiếp filter
tiêu thụ một số lượng bộ nhớ không đổi.
Câu hỏi của tôi là lý do tại sao các hàm được nhập trực tiếp trong GHC khác nhau rất nhiều với các hàm tôi viết bằng mã nguồn được sao chép từ Thư viện GHC. Tôi tự hỏi liệu có gì sai với GHC?
Tôi có thêm một câu hỏi: Đoạn mã trên được tóm tắt từ một dự án mà tôi đã viết, và dự án cũng phải đối mặt với vấn đề "tiêu thụ số lượng bộ nhớ ngày càng tăng, mà phải được thu thập trong lý thuyết". Vì vậy, tôi muốn biết rằng có một cách để tìm biến nào chiếm nhiều bộ nhớ trong GHC.
Cảm ơn bạn đã đọc.
Phiên bản GHC, HĐH? Tôi không thể tái tạo sự tăng trưởng bộ nhớ thực hiện 'elem' như thế. – Koterpillar
Được sao chép từ thư viện GHC? Thực sự có nhiều thứ trong đó hơn là chỉ những định nghĩa này, ví dụ ['{- # RULES" filter "[~ 1] forall p xs. bộ lọc p xs = build (\ cn -> foldr (filterFB cp) n xs) # -} '] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC- List.html # filter), có nghĩa là định nghĩa bạn trích dẫn bình thường sẽ không được sử dụng. - Điều đó nói rằng, tôi cũng không thể tái tạo các vấn đề tiêu thụ bộ nhớ của bạn. Bạn sử dụng cờ tối ưu nào? – leftaroundabout
Tôi nghĩ rằng anh ấy có nghĩa là các định nghĩa trong Prelude chuẩn. Không thể tái tạo vấn đề, bằng cách này. – mrueg