2010-07-12 72 views
12

F#交互式(以及一般的REPL式工具)是性能分析的理想入口。比選擇代碼塊並將其發送給性能分析報告返回的分析器要容易得多。不幸的是,它看起來像現有的配置文件沒有REPL支持:您必須將配置文件附加到進程或指定並執行或Web應用程序配置文件。F#交互式和性能分析器

我最終做的事情是將代碼塊包裝到單元測試中的配置文件中,然後針對NUnit命令行會話執行配置文件。但是,這是我們現在可以用F#做的最好的嗎?

+0

我在RedGate的螞蟻探查器論壇發佈了一個問題,他們說他們喜歡這個想法,並會考慮它。 – 2010-07-12 12:18:26

+0

還有另一種思考性能分析的方法 - 不是測量時間和計算呼叫,而是問「它到底在做什麼?」 - http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 – 2010-07-15 15:33:25

回答

9

問題是什麼?

您是否知道#time命令?例如。

#time "on" 
for i in 1..1000000 do 
    let r = f(i) 
    ignore r 

這使得F#像

--> Timing now on 
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0 

交互輸出在任何情況下,我想幹脆把代碼中的應用程序和運行鍼對應用程序的配置文件是比NUnit測試更好。無論哪種方式,是的,它可能需要花費額外的30秒時間將代碼粘貼到新應用程序中並將其編譯爲發行模式。但是,爲了獲得Visual Studio提供的豐富的分析信息,我很樂意付出這樣的代價。理想情況下,體驗可能會更好,但我懷疑你今天(或明天)會找到任何REPL友好的分析工具。

+0

是的,但只有在簡單情況下才有用。它沒有給你一個關於執行時間如何在調用堆棧中的操作之間進行分割的圖像。 – 2010-07-12 07:51:06

+0

並回答你的問題:「問題是什麼?」:問題不在於時間執行外部呼叫。問題在於性能分析遠不止於此:它是基於收集的性能數據的廣泛的性能分析。像dotTrace和ANTS這樣的現代性能分析器可以通過附加到進程或運行應用程序來實現,但如果他們可以剖析發送到F#Interactive的代碼,則效率會非常高。所以問題是這是否可以實現。 – 2010-07-12 08:37:28

+0

我不知道#time命令! – 2010-07-12 13:38:35

4

您可以嘗試使用Profiler編程API來實現此目的。我沒有試過,但這裏有螞蟻探查指令:我認爲以下可能成功http://help.red-gate.com/help/ANTSProfiler3/0/en/Topics/AP_UsingTheAPI.html

  1. 開始螞蟻探查,重視fsi.exe
  2. R「展鵬。 Profiler.Api.dll」在FSI

  3. 撒上代碼要與RedGate.Profiler.Api.Reset()/ RedGate.Profiler.Api.TakeSnapshot()來分析

DotTrace有(有?)類似的API(CPUProfiler.Start()/。StopAndTakeSnapshot()),但我找不到最新版本的參考。

+0

這是一個有趣的選項!謝謝你讓我知道。我會試試看。 – 2010-07-13 09:44:02

1

但這是我們現在可以用F#做的最好的嗎?

AFAIK,是的。這對於F#或第三方產品的下一個版本中的功能來說是個好主意!