对于ghci
,我可以限制ghci可以使用的内存
$ ghci +RTS -M10m -RTS
当我编译整个程序时,我可以
$ ghc -rtsopts a.hs
然后
$ ./a +RTS -M10m
如何为
runghc a.hs
执行此操作?我尝试了几种方法,例如runghc a.hs +RTS -M10m
,但是似乎都没有用。我唯一可以限制内存的选项是$ export GHCRTS='-M10m'
$ runghc a.hs
,但是我只希望这是一次,所以我更喜欢通过向
runghc
传递参数来做到这一点。编辑:我正在检查该选项是否正在使用以下策略(只是因为我不知道更好的方法):
-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0
打开两个终端,一个用于
top
命令,另一个用于执行代码。如果执行停止说“堆已耗尽”,我得出结论-M[number]m
在起作用。如果执行继续并使用大量内存,我将终止该进程并得出结论,该进程没有成功。 最佳答案
像chi一样使用GHCRTS=... runghc ...
是唯一的方法。由于runghc
解释其命令行的方式,因此+RTS
会被解释为runghc
本身的RTS选项(如果在末尾)或程序名称(如果在开头)。它永远不会到达运行时。您可以使用--RTS +RTS ...
强制将其传递给程序,但随后将其视为程序参数,运行时仍看不到它。
为了对此进行调查,我为ghc
编写了一个包装程序 shell 脚本,该脚本跟踪其参数,然后使用runghc
选项将其传递给-f
。
创建一个文件ghc-wrapper
,其中包含:
#!/bin/sh -x
exec ghc "$@"
-x
选项告诉/bin/sh
跟踪每一行。与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)
我们真正想要
runghc
执行的是:$ 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
...
但是,由于
runghc
并未对+RTS
进行特殊处理,因此无法指定它。关于haskell - 如何将RTS选项传递给runghc?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29339643/