【问题标题】:How can I load optimized code in GHCI?如何在 GHCI 中加载优化代码?
【发布时间】:2015-03-09 00:33:25
【问题描述】:

我正在编写一个依赖于优化的模块。我想在 ghci 中测试这个模块。但是在--interactive模式下启动ghc会自动禁用优化;如果我用-O 编译模块,然后尝试在交互式会话中加载它,ghc 坚持以解释模式加载它。

对于区分优化和未优化模块的简单测试用例,下面的isOptimized 在优化打开时计算为True,但在优化关闭时计算为False

isOptimized :: Bool
isOptimized = g

g :: Bool
g = False

{-# NOINLINE g #-}
{-# RULES "g/True"  g = True #-}

【问题讨论】:

    标签: haskell ghc compiler-optimization read-eval-print-loop ghci


    【解决方案1】:

    使用ghci -fobject-code -O Test.hscabal repl --ghc-options="-fobject-code -O"。更详细:

    1. ghci 必须使用-fobject-code flag 调用。

    2. 必须在命令行上或在模块顶部的 OPTIONS_GHC pragma 中给出优化标志之后 -fobject-code。尝试ghc --interactive -O -fobject-code 会产生“-O 与--interactive 冲突;-O 被忽略”的警告。这可能是一个错误。

    3. 如果您正在处理一个 cabalized 项目并使用 cabal repl,您需要在命令行(即 cabal repl --ghc-options="-fobject-code -O")或编译指示中传递标志。 Cabal(当前)在调用 ghci 时会丢弃在 .cabal 文件中设置的优化标志 ghc-options;事实上,它明确地设置了-O0。这可能是一个错误。

    请注意,在优化和未优化模式之间切换时,您有时需要手动强制重新编译。出于某种原因,只要 -fobject-code 保持打开状态,优化标志更改时构建工件不会失效。如果从头开始,您在 .cabal 文件中设置了 -fobject-code,运行编译模块的 cabal repl,然后记住您需要在命令行上设置 -O 并运行 cabal repl --ghc-options=-O,ghc 将愉快地加载先前编译的、未优化的模块。这也可能是一个错误。

    测试单个模块最可靠的方案似乎是将{-# OPTIONS_GHC -fobject-code -O #-} 放在模块的顶部。无论您如何调用 ghci,您都将获得优化的代码。我还没有调查在某些但不是所有模块都具有编译指示的多模块情况下会发生什么。

    顺便提一下,只有模块中的代码被优化了。即使开启了优化,在 repl 中评估 g 总是会产生 False,因为 repl 输入不受重写规则的约束。

    【讨论】:

    • 所以在我看来,这可能是一种通过 GHCi 对函数进行实际计时和粗略测量性能的方法。您或任何人可以批准或不批准吗?
    • @ChristianConkle 你看过这个话题吗? stackoverflow.com/questions/27541609/…
    • @WojciechDanilo - 是的。我刚刚在那里发表了评论。 (我认为我无法在该主题中@通知您,因为您尚未发表评论。)
    • 当我尝试包含 {-# OPTIONS_GHC -fobject-code -O #-} 时,我 crash
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2011-09-29
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多