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: Ten filter
jest kopiowany z biblioteki GHC
„s, ale dlaczego zużywa coraz większej liczby pamięci w kontrast z bezpośrednio zaimportowanym filter
, który zużywa stałą liczbę pamięci.Dlaczego bezpośrednio importowane funkcje w GHC różnią się tak bardzo z funkcji piszę z kodem źródłowym skopiowane z GHC Bibliotek
elem :: (Eq a) => a -> [a] -> Bool
elem _ [] = False
elem x (y:ys) = x==y || elem x ys
problem2: Ten filter
jest kopiowany z biblioteki GHC
„s, ale dlaczego zużywa coraz większej liczby pamięci jak bezpośrednio stosowanego elem
, który również zużywa coraz większej liczby pamięci w przeciwieństwie bezpośrednio zaimportowany filter
.
r = L.filter (==1000000000000) [0..]
p = filter (==1000000000000) [0..]
s = 1000000000000 `elem` [0..]
GHC wersja: 7.4.2 OS: Ubuntu 12.10 Zestawione z -O2 do optymalizacji
jak powyżej filter
i elem
'definicje s oznaczać zarówno p = filter (==1000000000000) [0..]
i s = 1000000000000 `elem` [0..]
' s [0..]
śmieci powinny być zbierane stopniowo. Ale zarówno p
, jak i s
zużywa coraz większą ilość pamięci. I r
, który jest zdefiniowany za pomocą bezpośrednio importowanego filter
, zużywa stałą liczbę pamięci.
Moje pytanie brzmi: dlaczego funkcje importowane bezpośrednio w GHC różnią się tak bardzo funkcjami, które piszę z kodem źródłowym skopiowanym z bibliotek GHC. Zastanawiałem się, czy coś jest nie tak z GHC?
Mam kolejne pytanie: Powyższy kod jest pobierany z projektu, który napisałem, a projekt napotyka również problem "pochłania coraz większą ilość pamięci, która powinna być zbiorem odpadów w teorii". Więc chcę wiedzieć, że istnieje sposób na znalezienie, która zmienna zajmuje tyle pamięci w GHC.
Dzięki za przeczytanie.
Wersja GHC, OS? Nie mogę odtworzyć wzrostu pamięci implementującego 'elem' właśnie tak. – Koterpillar
Skopiowano z biblioteki GHC? Jest tam o wiele więcej niż tylko te definicje, na przykład ['{- # RULES" filtr "[~ 1] dla wszystkich p xs. filter p xs = build (\ cn -> foldr (filterFB cp) n xs) # -} '] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC- List.html # filter), co oznacza, że zwykle cytowana definicja nie będzie używana. - Powiedziałem, że nie mogę również odtworzyć problemów związanych z konsumpcją pamięci. Z jakich flag optymalizacji korzystasz? – leftaroundabout
Myślę, że on oznacza definicje w standardowym Prelude. Nie można zreprodukować problemu, tak przy okazji. – mrueg