2015-03-30 6 views
10

Für ghci, kann ich die Erinnerung GHCI begrenzen, indemWie kann ich RTS-Optionen an runghc übergeben?

$ ghci +RTS -M10m -RTS 

verwenden können, wenn ich das ganze Programm zu kompilieren, kann ich

$ ghc -rtsopts a.hs 

dann

$ ./a +RTS -M10m 

Wie kann ich dies tun für runghc a.hs? Ich habe mehrere Möglichkeiten ausprobiert, wie runghc a.hs +RTS -M10m, aber keiner von ihnen scheint zu funktionieren. Die einzige Option, die ich den Speicher begrenzen konnte, war durch

$ export GHCRTS='-M10m' 
$ runghc a.hs 

, aber ich möchte diese nur einmal sein, so dass ich lieber tun dies durch Argumente zu runghc vorbei.


Edit: Ich überprüfe, ob die Option funktioniert oder nicht die folgende Strategie verwenden (nur weil ich bessere Möglichkeiten nicht kennen):

-- a.hs 
f x = f (f x) 
main = print $ seq (f 0) 0 

Öffnen Sie zwei Terminals, eines für top Befehl und ein anderer zum Ausführen des Codes. Wenn die Ausführung aufhört, "Heap erschöpft" zu sagen, schließe ich, dass -M[number]m funktioniert. Wenn die Ausführung fortgesetzt wird und viel Speicherplatz belegt ist, bringe ich den Prozess um und folge, dass es nicht gelingen konnte.

+0

'ranghc + RTS-M10m a.hs' oder' ranghc -rtsopts a.hs + RTS-M10m'? (Nur Raten) – Dogbert

+0

@Dogbert versuchte beide, und keiner arbeitete. Danke trotzdem :( – Yosh

+0

Wie überprüfen Sie, ob das Flag gesetzt ist oder nicht aus dem Programm? – Dogbert

Antwort

3

Verwenden GHCRTS=... runghc ... als chi sagt, ist der einzige Weg. Wegen der Art, wie runghc seine Befehlszeile interpretiert, wird +RTS als RTS-Optionen zu runghc selbst interpretiert (wenn es am Ende ist) oder als Programmname (wenn es am Anfang ist). Es erreicht nie die Laufzeit. Sie können erzwingen, dass es mit --RTS +RTS ... an das Programm übergeben wird, aber dann wird es als Programmargument behandelt und es wird immer noch nicht von der Laufzeit gesehen.

Um dies zu untersuchen, schrieb ich ein Wrapper Shell-Skript für ghc, die ihre Argumente verfolgt, und übergab diese runghc mit der -f Option.

Erstellen Sie eine Datei ghc-wrapper enthält:

#!/bin/sh -x 
exec ghc "[email protected]" 

Die -x Option sagt /bin/sh jede Zeile zu verfolgen. Verwenden Sie dies mit runghc:

$ runghc -f ./ghc-wrapper Hello.hs 
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs 
Hello, World! 

$ runghc -f ./ghc-wrapper Hello.hs +RTS -s 
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main [] Hello.hs 
Hello, World! 
    114,016 bytes allocated in the heap # runghc's heap, not Hello's 
    ... 

$ runghc -f ./ghc-wrapper Hello.hs --RTS +RTS -s 
+ exec ghc -ignore-dot-ghci -x hs -e :set prog "Hello.hs" -e :main ["+RTS","-s"] Hello.hs 
Hello, World! 

$ runghc -f ./ghc-wrapper -- +RTS -s -RTS Hello.hs 
+ exec ghc -ignore-dot-ghci -e :set prog "+RTS" -e :main ["-s","-RTS","Hello.hs"] +RTS 
+RTS:1:55: 
    Not in scope: `main' 
    Perhaps you meant `min' (imported from Prelude) 

Was wir wirklich runghc ausführen wollen, ist:

$ ghc -ignore-dot-ghci -x hs +RTS -s -RTS -e ':set prog "Hello.hs"' -e ':main []' Hello.hs 
Hello, World! 
     80,654,256 bytes allocated in the heap 
     ... 

Aber es gibt keine Möglichkeit zu geben, dass, weil runghc nicht +RTS speziell nicht behandeln.

Verwandte Themen