任何人都可以推荐具有良好F#支持的性能分析工具吗?
我一直在使用Visual Studio 2010分析器,但在使用F#时我发现了一些问题。感觉更像是我在反射后分析字节代码而不是原始的F#。
例如,在分析以下略显人为的例子时:
let Add a b =
a + b
let Add1 = Add 1
let rec MultiAdd count =
match count with
| 1 -> 1
| _ -> (Add1 1) + (MultiAdd (count - 1))
MultiAdd 10000 |> ignore
我得到以下调用树:
当我在功能详细信息中查看Microsoft.FSharp.Core.FSharpFunc`2.Invoke(0)时,我看到:
我理解我所看到的是基于已编译代码的底层实现,虽然我可以遵循它,但这很难。
有没有人有使用F#的其他分析工具的经验,他们是否能更好地映射到原始的F#代码?
答案 0 :(得分:7)
我的回答可能让您失望,但可能会有所帮助。
几个月前,我试图为我的F#项目找到一个好的免费 .NET分析器。我对nprof,slimtune,EQATEC和(最近商业化)Xte profiler的体验根本不合适。我发现他们对F#的支持非常有限,不得不回到Visual Studio 2010分析器。我认为你最好的选择是一些商业概况(我没有经验)。
过了一段时间,我习惯了剖析器,看到它的结果呈现简单,清晰,易懂。如果您正在优化并行程序,则使用Concurrent Visualizer将是不可避免的。那说你唯一关心的就是表现;与VS 2010 Profiler相处得很好,值得一试。
为了分析F#代码,我还发现CLR Profiler和ILSpy值得一提。如果您想最小化内存分配或垃圾回收,前者可以可视化堆。后者可以在IL或C#中生成等效代码(我比F#更熟悉);它可能有助于理解F#中的高阶构造如何正确使用它们。
<强>更新强>
Dave Thomas写了an excellent blog post,他使用了几个商业分析器来检测内存泄漏并调整异步应用程序。看看那些剖析器;它们可能符合您的偏好。
答案 1 :(得分:4)
这听起来像是在调试模式下的分析。您需要从项目中启用“优化代码” - &gt;属性 - &gt;构建菜单。您还可以在发布模式下进行配置,默认情况下启用此功能。如果不这样做,将会有很多调用调用和Tuple对象创建等。
上面的MultiAdd函数不是尾递归的。如果是,您还需要在调试模式下启用“生成尾调用”以进行性能分析。
这也是尾调用优化的好例子。
let Add a b =
a + b
let Add1 = Add 1
let rec MultiAdd total count =
match count with
| 1 -> 1 + total
| _ -> MultiAdd (count - 1) (total + Add1 1)
MultiAdd 10000 0 |> ignore