Haskell:功能组合(.)与功能应用程序($)在性能方面有何关系?

Mic*_*ron 6 performance haskell functional-programming

在Haskell中,当性能很重要并且使用美元或点都是有效选项时,哪一个比另一个好?一个人会比另一个人获得性能提升吗?

例如,给定(foo . bar. baz) valuefoo $ bar $ baz value,是一个比另一个快?

Ale*_*nov 15

如果您正在使用优化编译(-O2),GHC几乎将肯定都内嵌.$生产foo (bar (baz value))在这两种情况下(然后进一步优化它)."几乎"就是以防万一; 内联是最基本的优化GHC做的一个,都.$非常简单,内联他们应该永远是一场胜利,但我未必会想一些特别的情况.(我可以想到的一个案例是在内联它们时更难的是它们被部分应用或传递给更高阶函数,但这不是给出的例子;或者可能有一个重写规则在内联之前触发并仅覆盖一个这些案件.)

但是,您可以使用例如Criterion在特定情况下进行测试.您还可以通过要求GHC输出Core文件来验证内联是否发生.