我正在编写一个依赖于优化的模块。我想在ghci中测试这个模块。但是在--interactive
模式下启动ghc会自动禁用优化;如果我用-O
编译模块,然后尝试在交互式会话中加载它,ghc
坚持在解释模式下加载它。
对于区分优化模块和未优化模块的简单测试用例,下面的isOptimized
评估结果为True
并进行优化,但False
优化关闭:
isOptimized :: Bool
isOptimized = g
g :: Bool
g = False
{-# NOINLINE g #-}
{-# RULES "g/True" g = True #-}
答案 0 :(得分:12)
使用ghci -fobject-code -O Test.hs
或cabal repl --ghc-options="-fobject-code -O"
。更详细:
-fobject-code
flag 调用ghci
优化标志必须在命令行上的 -fobject-code
后面的中给出,或者在模块顶部的OPTIONS_GHC pragma中给出。尝试ghc --interactive -O -fobject-code
会产生一个警告:“-O与--interactive相冲突; -O被忽略”。这可能是一个错误。
如果您正在处理cabalized项目并使用cabal repl
,则需要在命令行(即cabal repl --ghc-options="-fobject-code -O"
)或pragma中传递标记。当调用ghci时,Cabal(当前)丢弃在.cabal文件中使用ghc-options
设置的优化标志;实际上,它明确地设置了-O0
。这可能是一个错误。
请注意,在优化和未优化模式之间切换时,有时需要手动强制重新编译。出于某种原因,只要-fobject-code
保持打开,优化标志发生变化时,构建工件就不会失效。如果从干净的平板开始,您在.cabal文件中设置了-fobject-code
,请运行编译模块的cabal repl
,然后记住您需要在命令行上设置-O并运行{{ 1}},ghc将很乐意加载以前编译的,未经优化的模块。这也许也是一个错误。
测试单个模块的最可靠方案似乎是将cabal repl --ghc-options=-O
放在模块的顶部。无论你如何调用ghci,你都会得到优化的代码。我没有调查在多模块情况下会发生什么,其中一些但不是所有模块都具有该编译指示。
顺便提一下,请注意,只有模块中的代码才会得到优化。即使进行了优化,在repl中评估{-# OPTIONS_GHC -fobject-code -O #-}
也会产生g
,因为repl输入不受重写规则的约束。