Sto*_*tly 17 performance f# functional-programming pointfree
我正在学习使用F#进行功能编程的第一步 - 我刚刚遇到了Forward Pipe(|>)和Forward Composition(>>)运算符.起初我以为它们只是糖而不是对最终运行的代码产生影响(尽管我知道管道有助于类型推断).
但是我遇到了这篇SO文章: 函数式编程中"点自由"风格的优点和缺点是什么? 其中有两个有趣且内容丰富的答案(而不是为我简化的事情,开启了围绕"无点"或"无意义"风格的整套蠕虫)我从这些(和其他阅读)带回家是无点的是一个争论的领域.与lambas一样,无点样式可以使代码更容易理解,也可以更难,具体取决于使用情况.它可以帮助有意义地命名.
但我的问题涉及对第一个答案的评论:AshleyF在答案中表示:
"在我看来,组合可能会降低GC的压力,使编译器更明显的是不需要像流水线那样产生中间值; 帮助使所谓的"砍伐森林"问题更容易处理."
加斯奇回复:
"关于改进编译的部分根本不是真的.在大多数语言中,无点样式实际上会降低性能.Haskell在很大程度上依赖于优化,因为它是使这些东西的成本可以承受的唯一方法.充其量,那些组合器被内联,你得到一个相同的有点版本"
任何人都可以扩展性能影响吗?(一般而言,特别是对于F#)我只是假设它是一种写作风格的东西,编译器会将两个习语解开成等效的代码.
svi*_*ick 35
这个答案将是F#特定的.我不知道其他函数式语言的内部是如何工作的,而且它们不能编译成CIL的事实可能会产生很大的不同.
我在这里可以看到三个问题:
|>什么?>>什么?答案(使用您链接的问题中的示例):
有什么区别x |> sqr |> sum和sum (sqr x)?
不,没有.编译的CIL完全相同(这里用C#表示):
sum.Invoke(sqr.Invoke(x))
Run Code Online (Sandbox Code Playgroud)
(Invoke()使用,因为sqr并且sum不是CIL方法,它们是FSharpFunc,但这在这里不相关.)
有什么区别(sqr >> sum) x和sum (sqr x)?
不,两个示例都编译为与上面相同的CIL.
有什么区别let sumsqr = sqr >> sum和let sumsqr x = (sqr >> sum) x?
是的,编译后的代码是不同的.如果指定参数,sumsqr则编译为普通的CLI方法.但是如果你没有指定它,它会被编译为FSharpFunc带有支持字段的类型属性,其Invoke()方法包含代码.
但是all的效果是调用无点版本意味着加载一个字段(the FSharpFunc),如果指定参数则不会这样做.但我认为除非在最极端的情况下,否则不应该对性能产生显着影响.
| 归档时间: |
|
| 查看次数: |
705 次 |
| 最近记录: |