我最近检查了F#应用程序的性能,在挖掘CIL时我发现FSharp.Core(适用于.NET v4.0)包含几个nop指令,许多未使用的变量和变量只是通过stloc / ldloc指令序列写入/读取一次 我已经调查了可能的原因,我注意到即使在发布模式下,F#程序集也包含--debug:pdbonly指令,并且没有办法禁用它并从项目设置UI切换到--debug-。 > 我想知道FSharp.Core的编译设置是否有特定的选择,如果是这样的话。否则期望完全优化的运行时版本是合法的吗?
答案 0 :(得分:5)
似乎对这个问题的评论已经回答了约90%;重申一下:
当然,F#编译器有可能以各种方式发出更好的代码(这可能适用于每个编译器);如果您对自己的应用进行了分析并注意到一些不好的事情(例如,与C#中的可比代码相比存在很大的差异),那么您可以通过邮寄fsbug来让F#团队知道。但首先要衡量。
答案 1 :(得分:1)
否则期望完全优化的运行时版本是合法的吗?
您建议的更改无法合理地视为优化。两者都是无害的,将由VM编译。 ISTR,mut用于替换堆叠,因为基于堆栈的VM可以堆叠溢出。这就是F#正确地解决了CLR中的错误。