好的F#性能分析工具

时间:2011-11-01 15:18:35

标签: performance f# profiling

任何人都可以推荐具有良好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

我得到以下调用树:

CallTree

当我在功能详细信息中查看Microsoft.FSharp.Core.FSharpFunc`2.Invoke(0)时,我看到: Function Details

我理解我所看到的是基于已编译代码的底层实现,虽然我可以遵循它,但这很难。

有没有人有使用F#的其他分析工具的经验,他们是否能更好地映射到原始的F#代码?

2 个答案:

答案 0 :(得分:7)

我的回答可能让您失望,但可能会有所帮助。

几个月前,我试图为我的F#项目找到一个好的免费 .NET分析器。我对nprofslimtuneEQATEC和(最近商业化)Xte profiler的体验根本不合适。我发现他们对F#的支持非常有限,不得不回到Visual Studio 2010分析器。我认为你最好的选择是一些商业概况(我没有经验)。

过了一段时间,我习惯了剖析器,看到它的结果呈现简单,清晰,易懂。如果您正在优化并行程序,则使用Concurrent Visualizer将是不可避免的。那说你唯一关心的就是表现;与VS 2010 Profiler相处得很好,值得一试。

为了分析F#代码,我还发现CLR ProfilerILSpy值得一提。如果您想最小化内存分配或垃圾回收,前者可以可视化堆。后者可以在IL或C#中生成等效代码(我比F#更熟悉);它可能有助于理解F#中的高阶构造如何正确使用它们。

<强>更新

Dave Thomas写了an excellent blog post,他使用了几个商业分析器来检测内存泄漏并调整异步应用程序。看看那些剖析器;它们可能符合您的偏好。

答案 1 :(得分:4)

这听起来像是在调试模式下的分析。您需要从项目中启用“优化代码” - &gt;属性 - &gt;构建菜单。您还可以在发布模式下进行配置,默认情况下启用此功能。如果不这样做,将会有很多调用调用和Tuple对象创建等。

上面的MultiAdd函数不是尾递归的。如果是,您还需要在调试模式下启用“生成尾调用”以进行性能分析。

enter image description here

这也是尾调用优化的好例子。

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

enter image description here