示例:
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/