2015-03-30 12 views
10

Per ghci, posso limitare la ghci memoria può utilizzare daCome posso passare le opzioni RTS a runghc?

$ ghci +RTS -M10m -RTS 

Quando compilo tutto il programma, posso

$ ghc -rtsopts a.hs 

poi

$ ./a +RTS -M10m 

Come posso fare questo per runghc a.hs? Ho provato diversi modi, come runghc a.hs +RTS -M10m, ma nessuno di loro sembra funzionare. L'unica opzione che potrei limitare la memoria era di

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

, ma voglio che questo sia solo una volta, quindi preferisco farlo passando argomenti per runghc.


Edit: Sto controllando se l'opzione funziona o non utilizzando la seguente strategia (solo perché non so modi migliori):

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

Aprire due terminali, uno per top comando e un altro per l'esecuzione del codice. Se l'esecuzione si interrompe dicendo "Heap esaurito", concludo che -M[number]m funziona. Se l'esecuzione continua e utilizza un'enorme quantità di memoria, uccido il processo e concludo che non ha avuto successo.

+0

'runghc + RTS -M10m a.hs' o' runghc -rtsopts a.hs + RTS -M10m'? (Solo indovinando) – Dogbert

+0

@Dogbert Provato entrambi, e nessuno dei due ha funzionato. Grazie comunque :( – Yosh

+0

Come stai verificando se il flag è impostato o meno dal programma? – Dogbert

risposta

3

utilizzando GHCRTS=... runghc ... come chi dice che è l'unico modo. A causa del modo in cui runghc interpreta la riga di comando, +RTS viene interpretato come opzioni RTS su runghc stesso (se è alla fine) o come nome di programma (se è all'inizio). Non raggiunge mai il runtime. Puoi forzarlo a passare al programma usando --RTS +RTS ... ma poi viene trattato come un argomento del programma e non è ancora visto dal runtime.

Per indagare su questo, ho scritto uno script di shell wrapper per ghc che traccia i suoi argomenti e lo ha passato a runghc con l'opzione -f.

Creare un file contenente ghc-wrapper:

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

L'opzione -x dice /bin/sh di tracciare ogni linea. Utilizzare questo con 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) 

ciò che vogliamo davvero runghc da eseguire è:

$ 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 
     ... 

Ma non c'è modo di specificare che, a causa runghc non tratta +RTS appositamente.

Problemi correlati