Con*_*nel 5 f# functional-programming
F#中的嵌套函数是否存在任何性能问题?
如果我有一个在数组中的每个项上调用的函数,并且该函数具有嵌套的内部函数,那么这是否意味着它需要声明,创建和分配所有内部嵌套函数的每次迭代?
看起来非常低效但我真的喜欢嵌套函数的可读性而不是私有外部函数.
scr*_*wtp 18
嵌套函数由编译器提取到继承的类中FSharpFunc,嵌套在模块或类型中定义其父函数的位置.因此,编译器基本上为您提供了外部私有函数的手工操作.
在运行时发生的所有事情都是这些对象的实例化.与执行内联代码相比,它有一个成本,但我想大大低于你在心智模型中的预期.
它确实为你留下了额外的GC对象.这个对象的实例化会在紧密循环中产生影响吗?在一个简单的实现中,函数对象在每次迭代中重新实例化,也许是.但是F#编译器比这更聪明,并且通常在循环外部实例化循环体中使用的函数.因此,成本可能会尽可能低.
如果有严重疑问,请咨询ILSpy和基准.根据经验 - 不要担心它只是使用嵌套函数.