在 Haskell 中,当性能很重要并且使用美元或点都是有效的选择时,一个比另一个更好吗?一种会导致性能优于另一种吗?
例如,给定 (foo . bar. baz) value
和 foo $ bar $ baz value
,一个比另一个快吗?
最佳答案
如果您使用优化(-O2
)进行编译,GHC 几乎肯定会同时内联 .
和 $
并生产foo (bar (baz value))
在这两种情况下(然后进一步优化)。 “几乎”是为了以防万一;内联是 GHC 所做的最基本的优化之一,.
和 $
非常简单,内联它们应该总是一个胜利,但我可能不会考虑一些特殊情况。 (当内联它们更难时,我能想到的一种情况是当它们被部分应用或传递给高阶函数时,但这不是给出的示例;或者可能有一个 rewrite rule 在内联之前触发并且只覆盖其中一种情况。)
但是,您始终可以使用例如在您的特定情况下对其进行测试。 Criterion .您还可以通过 asking GHC to output Core files 验证是否发生了内联。 .
关于performance - Haskell:在性能方面,函数组合 (.) 与函数应用程序 ($)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28926864/