如何将 RTS 选项传递给 runghc?
How can I pass RTS options to runghc?
对于ghci
,我可以通过
限制ghci可以使用的内存
$ ghci +RTS -M10m -RTS
当我编译整个程序时,我可以
$ ghc -rtsopts a.hs
然后
$ ./a +RTS -M10m
如何为 runghc a.hs
执行此操作?我尝试了多种方法,例如 runghc a.hs +RTS -M10m
,但其中 none 似乎有效。我可以限制内存的唯一选择是
$ export GHCRTS='-M10m'
$ runghc a.hs
,但我希望这只是一次,所以我更喜欢通过将参数传递给 runghc
。
编辑:我正在使用以下策略检查该选项是否有效(只是因为我不知道更好的方法):
-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0
打开两个终端,一个用于top
命令,另一个用于执行代码。如果执行停止说 "Heap exhausted",我断定 -M[number]m
正在工作。如果执行继续并使用大量内存,我会终止进程并得出结论认为它没有成功。
按照chi的说法使用GHCRTS=... runghc ...
是唯一的方法。由于 runghc
解释其命令行的方式,+RTS
被解释为 runghc
本身的 RTS 选项(如果它在末尾)或程序名称(如果它在开头) .它永远不会到达运行时。您可以使用 --RTS +RTS ...
强制将其传递给程序,但随后它被视为程序参数并且运行时仍然看不到它。
为了对此进行调查,我为 ghc
编写了一个包装器 shell 脚本来跟踪其参数,并使用 -f
选项将其传递给 runghc
。
创建文件 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
进行特殊处理。
对于ghci
,我可以通过
$ ghci +RTS -M10m -RTS
当我编译整个程序时,我可以
$ ghc -rtsopts a.hs
然后
$ ./a +RTS -M10m
如何为 runghc a.hs
执行此操作?我尝试了多种方法,例如 runghc a.hs +RTS -M10m
,但其中 none 似乎有效。我可以限制内存的唯一选择是
$ export GHCRTS='-M10m'
$ runghc a.hs
,但我希望这只是一次,所以我更喜欢通过将参数传递给 runghc
。
编辑:我正在使用以下策略检查该选项是否有效(只是因为我不知道更好的方法):
-- a.hs
f x = f (f x)
main = print $ seq (f 0) 0
打开两个终端,一个用于top
命令,另一个用于执行代码。如果执行停止说 "Heap exhausted",我断定 -M[number]m
正在工作。如果执行继续并使用大量内存,我会终止进程并得出结论认为它没有成功。
按照chi的说法使用GHCRTS=... runghc ...
是唯一的方法。由于 runghc
解释其命令行的方式,+RTS
被解释为 runghc
本身的 RTS 选项(如果它在末尾)或程序名称(如果它在开头) .它永远不会到达运行时。您可以使用 --RTS +RTS ...
强制将其传递给程序,但随后它被视为程序参数并且运行时仍然看不到它。
为了对此进行调查,我为 ghc
编写了一个包装器 shell 脚本来跟踪其参数,并使用 -f
选项将其传递给 runghc
。
创建文件 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
进行特殊处理。