在Haskell中,当性能很重要并且使用美元符或点号都是有效的选项时,哪个更好?一个会比另一个获得更好的性能吗?
例如,给定
例如,给定
(foo . bar. baz) value
和foo $ bar $ baz value
,哪个更快?(foo . bar. baz) value
和foo $ bar $ baz value
,哪个更快?-O2
)进行编译,GHC几乎肯定会内联.
和$
,并在两种情况下产生foo (bar (baz value))
(然后进一步优化)。“几乎”只是为了保险起见;内联是GHC执行的最基本的优化之一,而.
和$
都非常简单,内联它们应该总是胜利的,但我可能没有考虑到某些特殊情况。(我能想到的一个困难的内联情况是当它们被部分应用或传递给高阶函数时,但这不是给出的示例;或者可能有一个rewrite rule在内联之前触发,并且仅涵盖其中一种情况。)
然而,您始终可以使用Criterion在特定情况下进行测试。您还可以通过要求GHC输出Core文件验证是否进行了内联。
(foo . bar . baz) value
。 - dfeuer