2016-12-24 62 views
3

F#中嵌套函数是否存在性能问题?嵌套函数性能(F#)

如果我有一个函数在数组中的每个项目上调用,并且此函数嵌套了内部函数,那么这是否意味着每次迭代都需要声明,创建并分配所有内部嵌套函数?

看起来效率很低,但我真的很喜欢嵌套函数的可读性而不是私有的外部函数。

+3

也许 - 基准测试并参见 –

+1

感兴趣:[F#interactive #time](https://docs.microsoft.com/en-us/dotnet/articles/fsharp/tutorials/fsharp-interactive/) - [示例] (https://github.com/jack-pappas/fsharp-logic-examples/blob/d78b170ecfd7526971153e2f2a27446e0c51dd6e/Examples/dp.fsx#L41) –

回答

13

编译器将嵌套函数提取到继承于FSharpFunc的类中,这些类嵌套在定义其父函数的模块或类型中。因此,编译器基本上为您做了什么,否则您将手动执行外部私有功能。

运行时发生的所有事情都是这些对象的实例化。与执行内联代码相比,它有一定的成本,但是我认为这大大低于你在心智模型中预期的。

它确实为GC留下了额外的对象。那么这个对象实例化会在一个紧密的循环中起作用吗?在一个天真的实现中,每次迭代都会重新实例化函数对象,也许是的。但是F#编译器比这更聪明,通常在循环外实例化循环体中使用的函数。所以再次,成本可能是最低的。

严重疑问时,请咨询ILSpy和基准。作为一个经验法则 - 不要为此烦恼,只能使用嵌套函数。

+0

真棒的答案。谢谢你的帮助。 – Connel

+1

你忘了提起非闭合内部功能。 –

+1

@FyodorSoikin:在这方面,封闭和非封闭功能是否有区别?我没有观察到它。 – scrwtp