2010-07-12 13 views
12

F # Interactive (e in generale strumenti in stile REPL) è un ingresso ideale per il profiling delle prestazioni. Cosa potrebbe essere più facile che selezionare un blocco di codice e inviarlo direttamente a un profiler che tornerebbe con il rapporto di analisi delle prestazioni. Sfortunatamente sembra che i profiler esistenti non abbiano il supporto REPL: devi collegare un profiler a un processo o specificare ed eseguibile o un'applicazione Web per il profilo.F # interattivo e profiler di prestazioni

Quello che devo fare è avvolgere un blocco di codice nel profilo in un test dell'unità e quindi eseguire un profilo contro la sessione della riga di comando NUnit. Ma è questo il meglio che possiamo fare adesso con F #?

+0

Ho inserito una domanda nel forum RedGate ANTS Profiler, e hanno detto che gli piaceva l'idea e l'avrebbero presa in considerazione. –

+0

C'è un altro modo di pensare alla profilazione - non come misurare il tempo e contare le chiamate, ma come chiedere "Che diamine sta facendo?" - http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

risposta

9

Qual è la domanda?

Conosci il comando #time? Per esempio.

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

che dà F # output interattivo come

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

In ogni caso, penso che semplicemente mettendo il codice in un'applicazione e l'esecuzione del profilo contro l'app è meglio di un test NUnit. In ogni caso, sì, ti costa forse un altro 30 secondi di tempo per incollare il codice in una nuova app e compilarlo in modalità Release. Ma questo è un prezzo che sono felice di pagare per ottenere le proficue informazioni di profilazione fornite da Visual Studio. Idealmente, l'esperienza potrebbe essere migliore, ma dubito che troverete tutti gli strumenti di profilazione REPL-friendly oggi (o domani).

+0

Sì, ma questo è utile solo in casi semplici. Non ti dà un'idea di come il tempo di esecuzione è suddiviso tra le operazioni nello stack di chiamate. –

+0

E per rispondere alla tua domanda "qual è la domanda?": La domanda non riguarda l'esecuzione temporizzata di una chiamata esterna. La domanda riguarda il profilo delle prestazioni che è molto più di questo: si tratta di un'analisi delle prestazioni estesa basata su dati di performance raccolti.I moderni profiler delle prestazioni come dotTrace e ANTS possono farlo collegandosi a un processo o eseguendo un'applicazione, ma sarebbe molto efficace se potessero profilare il codice inviato a F # Interactive. Quindi la domanda era se questo può essere raggiunto. –

+0

Non sapevo nulla del comando #time! –

4

È possibile provare a utilizzare l'API programmatic di Profiler per ottenere ciò. Non ho provato questo, ma qui ci sono le istruzioni per ANTS Profiler: http://help.red-gate.com/help/ANTSProfiler3/0/en/Topics/AP_UsingTheAPI.html

Penso che la seguente potrebbe avere successo:

  1. avvio ANTS Profiler e allegare alla fsi.exe
  2. r "Redgate. Profiler.Api.dll" in FSI

  3. Cospargere il codice che si desidera al profilo con RedGate.Profiler.Api.Reset()/RedGate.Profiler.Api.TakeSnapshot()

DotTrace ha (aveva?) API simile (CPUProfiler.Start() /. StopAndTakeSnapshot()), ma non ho trovato i riferimenti per le ultime versioni.

+0

Questa è un'opzione interessante! Grazie per avermi fatto sapere. Lo proverò. –

1

Ma questo è il meglio che possiamo fare adesso con F #?

AFAIK, sì. Questa è una grande idea per una funzionalità nella prossima versione di F # o comunque di un prodotto di terze parti!

Problemi correlati