gpt4 book ai didi

performance - 无点样式的性能含义

转载 作者:行者123 更新时间:2023-12-03 13:48:08 26 4
gpt4 key购买 nike

在使用F#学习函数编程方面,我迈出了第一步,而我刚遇到了Forward Pipe(|>)和Forward Composition(>>)运算符。起初我以为它们只是糖而不会对最终的运行代码产生影响(尽管我知道管道有助于类型推断)。

但是我碰到了这样的文章:
What are advantages and disadvantages of “point free” style in functional programming?
它有两个有趣且有益的答案(不是为我简化事情,而是围绕“无指向”或“无指向”样式打开了一大堆蠕虫)我从这些观点(以及其他相关读物)中得出的结论是无指向的是一个有争议的领域。像lambas一样,无点样式可以使代码更易于理解,或者变得更难,具体取决于使用情况。它可以帮助有意义地命名事物。

但是我的问题涉及对第一个答案的评论:
AshleyF沉迷于答案:


“在我看来,通过使编译器更清楚地知道,无需像流水线一样产生中间值,合成可以降低GC压力;帮助解决所谓的“森林砍伐”问题。”


加什回答:


“关于改进编译的部分根本不正确。在大多数语言中,无点样式实际上会降低性能。 Haskell完全依赖优化,因为这是使这些事情的成本可以承受的唯一途径。充其量,这些组合器会内联,您可以获得同等有意义的版本”


任何人都可以扩展其性能含义吗? (通常,特别是对于F#)我只是假设这是一种写作风格的东西,编译器会将这两个惯用法解压缩为等效的代码。

最佳答案

这个答案将是特定于F#的。我不知道其他功能语言的内部工作原理,并且它们不编译为CIL可能会产生很大的不同。

我在这里可以看到三个问题:


使用|>对性能有何影响?
使用>>对性能有何影响?
使用参数声明函数和不使用参数声明函数之间的性能差异是什么?


答案(使用the question you linked to中的示例):


x |> sqr |> sumsum (sqr x)有什么区别?

不,没有。编译的CIL完全相同(此处用C#表示):

sum.Invoke(sqr.Invoke(x))


(使用 Invoke(),因为 sqrsum不是CIL方法,它们是 FSharpFunc,但这与此处无关。)
(sqr >> sum) xsum (sqr x)有什么区别?

否,两个样本均编译为与上述相同的CIL。
let sumsqr = sqr >> sumlet sumsqr x = (sqr >> sum) x有什么区别?

是的,编译后的代码是不同的。如果指定该参数,则 sumsqr将编译为普通的CLI方法。但是,如果不指定它,它将被编译为 FSharpFunc类型的属性,并带有一个后备字段,该后备字段的 Invoke()方法包含代码。

但是,总的来说,调用无点版本意味着加载一个字段( FSharpFunc),如果指定该参数,则不会完成。但我认为,除非在最极端的情况下,否则不应显着影响性能。

关于performance - 无点样式的性能含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11649893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com