F# FSharp.Core未优化?

F# FSharp.Core未优化?,f#,cil,F#,Cil,我最近检查了一个F#应用程序的性能,在深入研究CIL时,我发现FSharp.Core(用于.NET v4.0)包含几个nop指令、许多未使用的变量和变量,这些变量只能通过stloc/ldloc指令序列写入/读取一次。 我已经调查了可能的原因,并注意到即使在发布模式下,F#程序集也包含--debug:pdbonly指令,无法禁用该指令并从项目设置UI切换到--debug-。 我想知道FSharp.Core的编译设置是否有特定的选择,如果有,那是什么。否则,期待运行时的完全优化版本是合理的吗?关于这

我最近检查了一个F#应用程序的性能,在深入研究CIL时,我发现FSharp.Core(用于.NET v4.0)包含几个nop指令、许多未使用的变量和变量,这些变量只能通过stloc/ldloc指令序列写入/读取一次。
我已经调查了可能的原因,并注意到即使在发布模式下,F#程序集也包含--debug:pdbonly指令,无法禁用该指令并从项目设置UI切换到--debug-。

我想知道FSharp.Core的编译设置是否有特定的选择,如果有,那是什么。否则,期待运行时的完全优化版本是合理的吗?

关于这个问题的评论似乎已经回答了90%的问题;重申:

  • 几乎所有的二进制版本都是用--debug:pdbonly编译的
  • 即使IL代码是次优的,但由于JIT将其优化掉,这可能不会对现实世界产生任何影响
当然,F#编译器可以通过各种方式潜在地发出更好的代码(这可能适用于所有编译器);如果你对你的应用程序进行了评测,发现了一些不好的地方(例如,与C#的可比代码相比有很大的差异),那么你可以通过邮寄fsbug让F#团队知道。但首先要衡量

否则,期待运行时的完全优化版本是合法的吗


您建议的更改不能合理地视为优化。两者都是无害的,将被VM编译掉。ISTR中,使用变异替换堆栈,因为基于堆栈的VM可能导致堆栈溢出。因此,这就是F#正确地解决CLR中的错误。

相关问题
--debug:pdbonly
对于发布代码来说是正常的,这只包括有限的调试信息,并允许对堆栈进行解码。所有的Windows(包括.NET)都是这样构建的:MS就是这样在他们的符号服务器上提供符号的。@Richard:谢谢。我怀疑与调试相关的原因,但我想知道,更优化的版本是否会带来性能优势…在性能关键的、受计算限制的应用程序中,人们希望能够牺牲调试能力来压缩每个cpu周期…@emaster70:PDB only debug information没有性能影响,我对你问题的核心不予评论。你的分析是否发现了F#core库的具体问题?我希望JIT编译器忽略任何NOP,所以我不希望这会带来任何实际的性能问题。