在Haskell中,当性能很重要并且使用美元或点数都是有效选项时,一个比另一个好吗?是否会导致性能提升?
例如,给定(foo . bar. baz) value
和foo $ bar $ baz value
,是否比另一个更快?
答案 0 :(得分:15)
如果您正在使用优化(-O2
)进行编译,那么GHC几乎肯定会内联.
和$
并在两种情况下生成foo (bar (baz value))
(然后进一步优化它) )。 "近"是以防万一;内联是GHC最基本的优化之一,.
和$
都非常简单,内联它们应该永远是一个胜利,但我可能不会考虑某些特定情况。 (一个案例我可以想到在内联它们时更难的是当它们被部分应用或传递给更高阶函数时,但这不是给出的例子;或者可能存在一个rewrite rule在内联之前触发并且仅涵盖其中一个案例。)
但是,您可以使用以下方法在特定情况下对其进行测试。 Criterion。您还可以通过asking GHC to output Core files验证内联是否已发生。