2011-11-01 38 views
14

任何人都可以推薦具有良好F#支持的性能分析工具嗎?好的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。在功能細節中調用(0)我看到: Function Details

我明白什麼我看到的是基於編譯代碼的底層實現,儘管我可以遵循它,但很難。

有沒有人有與F#一起使用其他分析工具的經驗,並且他們能夠更好地映射到原始F#代碼?

+0

你有沒有嘗試過的CPU採樣,而不是在函數調用儀器的選項? – gradbot

回答

6

我的答案可能會令你失望,但它可能會有幫助。

幾個月前,我試着爲我的F#項目找到一個很好的免費 .NET分析器。我對nprof,slimtune,EQATEC和(最近商業)Xte profiler的經驗根本不合格。我發現他們對F#的支持非常有限,不得不回退到Visual Studio 2010 profiler。我認爲你最好的選擇是一些商業分析器(我沒有經驗)。

過了一段時間後,我習慣了剖析器,並且看到它的結果呈現方式簡單,清晰且易於理解。如果您正在優化並行程序,那麼使用並行展示器將是不可避免的。這就是說你關心的唯一事情就是表現;與VS 2010分析器相處得很好值得嘗試。

對於剖析F#代碼,我還發現CLR ProfilerILSpy值得一提。前者可以將可視化堆放在需要最小化內存分配或垃圾回收的情況下。後者可以在IL或C#中生成相同的代碼(我比F#更熟悉它);它可能有助於理解F#中的高階構造如何正確使用它們。

UPDATE:

戴夫·托馬斯寫an excellent blog post在那裏,他用了幾個商業廓線儀來檢測內存泄漏和調整的異步應用。看一下這些配置文件;他們可能會適合您的偏好。

+2

感謝您的提及!主要的問題是將名稱映射回F#類型,檢查http://www.jetbrains.com/profiler/的評估是否有一個「代碼行」選項,它允許您剖析有問題的行 – 7sharp9

+0

Do你知道任何工具,將在Mac上工作? – czifro

4

聽起來像在調試模式下的分析。您需要從項目 - >屬性 - >構建菜單中啓用「優化代碼」。您也可以在默認情況下啓用此功能的發佈模式下進行配置。如果你不這樣做,除了其他事情外,還會有很多的調用調用和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

+0

我試着在發佈模式下運行它,並確保選中「優化代碼」,但仍得到相同的結果。我錯過了什麼嗎? –

+2

@KeithHarrison invoke調用在這種情況下不會消失,因爲這個函數不是尾遞歸的。試試我添加的尾巴呼叫版本。調試器也有一個降噪濾波器。您可以將其設置爲忽略低於%時間的呼叫。 – gradbot