【问题标题】:Should I go for subfunctions or helper functions in F#?我应该在 F# 中使用子函数还是辅助函数?
【发布时间】:2021-09-13 14:30:51
【问题描述】:

我正在用 F# 编写一个更大的项目,其中性能至关重要。到目前为止,核心结构是 19 个函数,它们都具有相同的签名:参数 -> 记录 -> Result(Record, Error) 以及这些函数的适当组合/绑定,以确保在下一个函数中使用前一个函数产生的记录。这些参数永远不会被覆盖,因此它们在所有 19 个函数调用中都是相同的。这里是“最终”功能:

let execution parameters record = 
let (>==) m f = Result.bind (f parameters) m

record
|> stepOne parameters
>== stepTwo
>== stepThree

我的问题是:在性能(或风格)方面,将步骤定义为类型为 record -> record 的“执行”的子函数会更好,这样就不必将相同的参数传递 19 次不同的功能? 它还允许代码依赖于特定参数(参数是记录类型)而不是一次所有参数。另一方面,这些子功能不能在这个上下文之外重用(我不认为,他们永远不会),这可能会使单元测试更加困难。在我的情况下,这也意味着一个很长的执行功能,这可能是不可取的。非常感谢任何输入!

【问题讨论】:

    标签: performance f#


    【解决方案1】:

    “在性能(或风格)方面,将步骤定义为类型为 record -> record 的“执行”的子函数会更好,这样相同的参数不必通过不同的函数传递 19 次吗? "

    肯定是的。就这样写,然后profile

    更笼统的:

    进入良好的 F# 编程风格需要一点时间,阅读书籍或良好的代码存储库有助于实现这一目标。

    您的代码使用“面向铁路的编程”,最好由 Scott Wlaschin 解释:https://fsharpforfunandprofit.com/rop/

    这种编程风格很好,但肯定不适合高性能循环。但即使在高性能敏感程序中,也只有 5% 的代码处于高性能循环中。所以漂亮的设计模式有很大的空间。优化核心性能代码只能针对具体案例进行。该技术首先是尝试和分析。如果您提到的代码确实处于性能关键路径中,那么您的测量将表明避免函数调用和参数传递会导致代码更快。

    【讨论】:

    • 谢谢!这很有帮助。你确实是对的,它是受 Wlaschin 启发的。一旦我们有一些东西可以真正做它应该做的事情,分析将是我们要去的地方。但是,尽早尝试并考虑性能是没有坏处的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2015-03-09
    • 2021-10-09
    • 2019-01-17
    • 2019-08-05
    相关资源
    最近更新 更多