【问题标题】:Nested functions performance (F#)嵌套函数性能 (F#)
【发布时间】:2023-04-01 03:54:01
【问题描述】:

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

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

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

【问题讨论】:

标签: f# functional-programming


【解决方案1】:

编译器将嵌套函数提取到继承自 FSharpFunc 的类中,嵌套在定义其父函数的模块或类型中。因此,编译器本质上为您完成了您原本需要手动执行的操作,外部私有函数。

在运行时发生的所有事情都是这些对象的实例化。与执行内联代码相比,它需要付出一定的代价,但我想这远远低于您在心智模型中的预期。

它确实给你留下了一个额外的 GC 对象。那么这个对象实例化在一个紧密的循环中会很重要吗?在一个简单的实现中,函数对象在每次迭代中都被重新实例化,也许是的。但是 F# 编译器比这更聪明,它通常在循环外实例化循环体中使用的函数一次。同样,成本可能尽可能低。

如有严重疑问,请咨询ILSpy 并进行基准测试。根据经验 - 不要为此烦恼,只需使用嵌套函数即可。

【讨论】:

  • 很棒的答案。感谢您的帮助。
  • 你忘了提到提升非闭包内部函数。
  • @FyodorSoikin:在这方面,闭包和非闭包函数有区别吗?我没观察到。
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多