performance - 调用递归内部函数时如何避免创建 FSharpFunc 的新实例?

标签 performance recursion f# inline

示例:

let inline ReadState() = 

    let rec f (w : SpinWait) = 
        if (...) then
            w.SpinOnce()
            f(w)
        else
            result 

    f (new SpinWait())

使用 ILSpy 我注意到 ReadState() 每次被调用时都会创建 FSharpFunc 的新实例

new Memory@f222().Invoke()  // Memory@f222 implement FSharpFunc

如何避免?

如果f不是内部乐趣,则没有创建实例,但我需要另一个命名函数:

let rec InternalReadState(w : SpinWait) = .... 

let ReadState() = InternalReadState(new SpinWait())

不太漂亮:(

最佳答案

据我所知,您有几个选择,但您可能对其中任何一个都不满意。最简单的方法是删除 inline ,然后将 () 参数移到嵌套函数之后:

let ReadState = 

    let rec f (w : SpinWait) = 
        if (...) then
            w.SpinOnce()
            f(w)
        else
            result 

    fun () -> f (new SpinWait())

您需要在此处删除inline,因为它只能应用于语法函数。

正如您所注意到的,您的另一种选择是创建另一个命名函数。如果您担心不需要的命名函数会污染您的作用域,那么有一些选项可以缓解这种情况。您可以使用签名文件仅公开 ReadState 函数,也可以使用 private 修饰符将其设置为您所在范围之外的私有(private):

module MyStuff =
    let rec private f (w:SpinWait) = ...
    let inline ReadState() = f (new SpinWait())

关于performance - 调用递归内部函数时如何避免创建 FSharpFunc 的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20603696/

相关文章:

performance - 过滤器与 CSS Sprites - CSS3 回退

performance - Web 应用程序性能基准的建议

performance - HMGET 以及字段数量和阅读性能之间的相关性

javascript - Promise 无法通过 setTimeOut 的递归函数解析

Javascript: 'closured' 变量的性能

javascript - 使用递归 promise 阻止内存泄漏

Javascript 查找编辑距离未返回正确值

f# - 一个 F# 4.1 编译器包含 netstandard 的 targetPlatform 值,另一个不包含

generics - 具有泛型参数类型的函数

c# - F# 在哪些区域生成 "absolute no sense in using"?