2011-11-01 19 views
14

Qualcuno può consigliare uno strumento di profilazione delle prestazioni con un buon supporto F #?Buono strumento di performance F #

Utilizzo il profiler di Visual Studio 2010 ma ho riscontrato alcuni problemi durante l'utilizzo di F #. Sembra più che sto profilando il codice byte dopo la riflessione rispetto al F # originale.

Per esempio a profilare il seguente esempio un po 'forzato:

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 

ottengo il seguente albero di chiamata:

CallTree

Quando osservo Microsoft.FSharp.Core.FSharpFunc`2. Richiamare (0) nei dettagli della funzione Vedo: Function Details

Capisco che cosa Vedo che si basa sull'implementazione sottostante del codice compilato e sebbene io possa seguirlo, è difficile.

Qualcuno ha esperienza nell'uso di altri strumenti di profilazione con F # e fa un lavoro migliore di mappatura sul codice F # originale?

+0

Hai provato l'opzione per il campionamento della CPU al posto della strumentazione su chiamate di funzione? – gradbot

risposta

6

La mia risposta potrebbe deludervi, ma potrebbe essere utile.

Alcuni mesi fa, ho cercato di trovare un buon profiler .NET per il mio progetto F #. La mia esperienza con nprof, slimtune, EQATEC e (di recente commerciale) Xte profiler non era affatto soddisfacente. Ho trovato che il loro supporto per F # era molto limitato e ha dovuto ricorrere al profiler di Visual Studio 2010. Penso che la tua migliore scommessa qui sia un profiler commerciale (di cui non ho esperienza).

Dopo un po ', mi abituo al profiler e vedo la sua presentazione dei risultati facile, chiara e comprensibile. Se stavi ottimizzando i programmi paralleli, l'uso del Visualizer simultaneo sarebbe inevitabile. Detto questo, l'unica cosa che ti interessa sono le prestazioni; andare bene con VS 2010 profiler vale la pena di provare.

Per la profilatura del codice F #, trovo anche il valore CLR Profiler e ILSpy. Il primo può visualizzare gli heap nel caso in cui si desideri minimizzare l'allocazione della memoria o la garbage collection. Quest'ultimo può produrre codice equivalente in IL o C# (che mi è più familiare di F #); può aiutare a capire come funzionano i costrutti di alto ordine in F # per poterli utilizzare in modo appropriato.

UPDATE:

Dave Thomas ha scritto an excellent blog post dove ha utilizzato più profiler commerciali per rilevare perdite di memoria e ottimizzare un'applicazione asincrona. Dai un'occhiata a questi profiler; possono soddisfare le tue preferenze.

+2

Grazie per la menzione! Il problema principale è la mappatura dei nomi sui tipi F #, controllare la valutazione di http://www.jetbrains.com/profiler/ se disponeva di un'opzione "linee di codice" che consente di tracciare il profilo fino alla riga incriminata – 7sharp9

+0

Do sai di tutti gli strumenti che funzioneranno su Mac? – czifro

4

Sembra il tuo profilo in modalità Debug. È necessario abilitare "Ottimizza codice" da progetto -> proprietà -> menu build. Puoi anche creare un profilo in modalità di rilascio che ha abilitato questa opzione per impostazione predefinita. Se non lo fai ci saranno molte chiamate invoke e la creazione di oggetti Tuple tra le altre cose.

La funzione MultiAdd in alto non è ricorsiva in coda. Se lo fosse, dovresti anche abilitare "Genera chiamate tail" in modalità Debug per il profiling.

enter image description here

Questo sarebbe anche un buon caso per l'ottimizzazione chiamata coda.

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

Ho provato a farlo funzionare in modalità di rilascio e ho assicurato che "Ottimizza codice" sia stato controllato ma ottenesse lo stesso risultato. Mi sto perdendo qualcosa? –

+2

@KeithHarrison in questo caso le chiamate di richiamo non andranno via perché questa funzione non è ricorsiva di coda. Prova la versione chiamata coda che ho aggiunto. Il debugger ha anche un filtro per la riduzione del rumore. Puoi impostarlo per ignorare le chiamate al di sotto di%. – gradbot