我以我的第一个孩子步骤使用F#学习功能编程和我刚刚遇到了去路管(|>),并正向组成(>>)运算符。 起初我以为他们只是糖,而不是最终的运行代码的效果(虽然我知道管道有助于类型推断)。
然而我来到这个SO文章跨越: 什么是函数式编程的优点和“自由点”式的缺点是什么? 其中有两个有趣和翔实的答案(而不是简化的东西对我说,打开周围的“即自由”或“毫无意义”的风格蠕虫的一个整体,)我带回家的这些(和其他阅读周围)是即点即免费是一个争论不休的区域。 像lambas,自由点式可以使代码更容易理解,或更难,这取决于使用。 它可以在有意义的事物命名帮助。
但我的问题是关于第一个答案评论:AshleyF缪斯的答案:
“这在我看来,组合物可通过使之更明显的编译器,没有必要生产中间值作为流水线降低GC的压力; 帮助使所谓的“毁林”的问题更容易处理。”
Gasche回复:
“关于改进编译的部分是不正确的。 在大多数语言中,自由点式实际上将降低性能。 哈斯克尔在很大程度上依赖于优化,正是因为它是使这些东西的成本可以承受的唯一途径。 充其量,这些组合子是内联的路程,你会得到一个相当于贴题版”
任何人都可以对性能影响更大呢? (一般和专门为F#)我刚刚以为这是一个写作风格的东西,编译器会unstrangle两个成语等效代码。
这个答案将是F#特异性。 我不知道其他函数式语言工作的内部,而事实上,他们没有编译成CIL怎么可能有很大的不同。
我可以在这里看到三个问题:
- 什么是使用的性能影响
|>
- 什么是使用对性能的影响
>>
? - 是什么声明一个函数与它的参数,并且没有它们之间的性能差异?
这些问题的答案(使用实例从您链接到的问题 ):
是否有任何区别x |> sqr |> sum
与sum (sqr x)
不,没有。 编译CIL是完全一样的(这里在C#中表示):
sum.Invoke(sqr.Invoke(x))
( 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()
方法中包含的代码。
但是,所有的效果是调用自由点版本是指装载一个字段( FSharpFunc
),如果您指定的参数,它没有这样做。 但我认为,不应该可测量影响性能,除了在最极端的情况。