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 kopiert schreiben: Diese filter
aus GHC
‚s Bibliothek kopiert, aber warum verbraucht es eine wachsende Anzahl von Speicher in Kontrast zu der direkt importiert filter
, die eine konstante Anzahl von Speicher verbraucht.Warum in GHC direkt importierten Funktionen mit Funktionen so viel unterscheiden mich mit dem Quellcode von GHC Bibliotheken
elem :: (Eq a) => a -> [a] -> Bool
elem _ [] = False
elem x (y:ys) = x==y || elem x ys
Problem2: Diese filter
aus GHC
‚s Bibliothek kopiert, aber warum es verbraucht eine wachsende Anzahl von Speicher wie die direkt elem
verwendet, die auch eine wachsende Anzahl von Speichern mit im Gegensatz verbraucht die direkt importiert filter
.
r = L.filter (==1000000000000) [0..]
p = filter (==1000000000000) [0..]
s = 1000000000000 `elem` [0..]
GHC Version: 7.4.2 OS: Ubuntu 12.10 mit -O2 Zusammengestellt
Als die oben filter
und elem
's Definitionen implizieren sowohl p = filter (==1000000000000) [0..]
und s = 1000000000000 `elem` [0..]
' s [0..]
sollte Müll allmählich gesammelt werden, um zu optimieren. Aber sowohl als auch s
verbrauchen eine wachsende Anzahl von Speicher. Und r
, die mit der direkt importierten filter
definiert ist, verbraucht eine konstante Anzahl von Arbeitsspeicher.
Meine Frage ist, warum sich direkt importierte Funktionen in GHC so sehr durch Funktionen unterscheiden, die ich mit dem aus GHC Libraries kopierten Quellcode schreibe. Ich habe mich gefragt, ob etwas mit GHC nicht stimmt.
Ich habe eine weitere Frage: Der obige Code ist abstrahiert von einem Projekt, das ich geschrieben habe, und das Projekt steht auch vor dem Problem "verbraucht eine wachsende Anzahl von Speicher, die in der Theorie Müll gesammelt werden sollte". Also möchte ich wissen, dass es eine Möglichkeit gibt herauszufinden, welche Variable in GHC so viel Speicher beansprucht.
Danke für Ihre Lektüre.
GHC-Version, OS? Ich kann das Speicherwachstum, das 'elem' implementiert, einfach nicht so reproduzieren. – Koterpillar
Aus der GHC-Bibliothek kopiert? Es gibt tatsächlich viel mehr drin als nur diese Definitionen, zum Beispiel ['{- # RULES" Filter "[~ 1] forall p xs. Filter p xs = build (\ cn -> foldr (Filter FB cp) n xs) # -} '] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC- List.html # filter), was bedeutet, dass die normal zitierte Definition nicht verwendet wird. - Das heißt, ich kann auch nicht Ihre Gedächtniskonsum Probleme reproduzieren. Welche Optimierungsflags verwenden Sie? – leftaroundabout
Ich denke, er meint die Definitionen im Standard Prelude. Das Problem kann übrigens auch nicht reproduziert werden. – mrueg