好的F#性能分析工具

Kei*_*son 18 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
Run Code Online (Sandbox Code Playgroud)

我得到以下调用树:

CallTree

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

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

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

pad*_*pad 8

我的回答可能让你失望,但它可能会有所帮助.

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

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

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

更新:

Dave Thomas写了一篇很棒的博客文章,他使用了几个商业分析器来检测内存泄漏并调整异步应用程序.看看那些剖析器; 它们可能适合您的偏好.

  • 谢谢你的提及!主要问题是将名称映射回F#类型,检查http://www.jetbrains.com/profiler/的评估是否有"代码行"选项,允许您分析到违规行 (2认同)