2010-05-03 10 views

risposta

28

È inoltre possibile utilizzare l'API di raccolta dati del profiler per avviare e interrompere la creazione di profili in base ai metodi a cui si è interessati. Vedere this MSDN article per una procedura dettagliata.

Il modo migliore di utilizzare l'API in questo caso è chiamare lo StartProfile poco prima dell'esecuzione dei metodi e quindi chiamare lo StopProfile subito dopo. Dovresti iniziare a profilare l'opzione "Inizia con profilatura in pausa" in modo da non iniziare la profilatura fino a quando non raggiungi la prima chiamata a StartProfile.

L'utilizzo dell'API di raccolta dati funziona con campionamento o strumentazione.

1

no.

Stai cercando "il collo di bottiglia", giusto?

Probabilmente non è nella funzione in cui si pensa che sia.

This is the method I rely on, for any language or OS.

Se il problema è in quella funzione, vi dirà. Se è da qualche altra parte, te lo dirà.


@downvoter: Qual è il problema? Se si è preoccupati della velocità di avvio dell'applicazione, prelevare manualmente i campioni durante l'avvio dell'applicazione.

L'alternativa in un profiler è eseguirla per tutto il tempo e quindi provare a capire quale parte della timeline era l'avvio. E poiché gran parte del tempo è trascorso in user-wait, quando non vuoi campioni, lo metti nella modalità di campionamento della CPU. Il guaio è che non si vedono cose come il tempo di I/O impiegato per caricare DLL, interrogare DNS, ecc., Che può essere dominante durante l'avvio.

Poi c'è l'intera questione della sciocchezza della presentazione come "hot path", dove il vero acquirente del tempo può easily hide.

Nel caso in cui chiedi "Come posso esaminare migliaia di campioni di stack?" la risposta è non è necessario. Se l'avvio è notevolmente lento, è perché sta spendendo una parte considerevole del suo tempo facendo qualcosa che non ha bisogno di fare - una frazione come, ad esempio, il 30%, per essere prudenti. Ciò significa che lo vedrete, in media, una volta ogni 3.33 campioni. Dal momento che è necessario vederlo due o più volte per sapere che è un problema, in media sono necessari 6,67 campioni. Più grande è il problema, meno campioni sono necessari. (Se è del 90%, sono necessari solo 2/0,9 = 2,2 campioni.) Se si esaminano 20 campioni, si vedranno problemi di oltre il 10% e, se si risolve, eventuali problemi minori richiedono una percentuale maggiore - sono amplificati dal rapporto di accelerazione, quindi sono più facili da trovare al prossimo go-around. Here's the math.

+0

a volte si desidera limitare l'ambito a una parte specifica dell'applicazione ... ad es. un'applicazione web richiede molto tempo per iniziare (solo perché ha molto da fare), ma voglio verificare come si comporta una parte specifica nel processo di avvio, quelli che ho scritto, non il codice che l'infrastruttura di un asp .net esegue l'applicazione. – rekna

+0

@rekna: OK, se riesci a eseguirlo con un debugger, prendi i campioni di stack. Se la tua routine è in pila meno del 10% delle volte, allora è probabile che non valga la pena accelerare - questa è la tua chiamata. Se è in pila più spesso di quello, allora i campioni ti diranno esattamente come trascorre il suo tempo (cioè dove chiama ciò che, e che è * che * chiama, ecc.) Su base percentuale. Questo è ciò che ti porterà direttamente al codice che puoi accelerare, supponendo che ce ne sia un po '. (Di solito c'è.) –

+0

@rekna: le applicazioni .net tendono a fare un sacco di hoo-ha durante l'avvio - cose che non indovinerai mai, e potrebbero essere sotto il tuo codice e potrebbero non farlo. Caricamento di plug-in, caricamento delle risorse, inizializzazione delle strutture dati, caricamento dei controlli dell'interfaccia utente, inizializzazione delle griglie, tutto questo è noto per aver vagato su inseguimenti selvaggi di codice. –

14

Sì, con un piccolo sforzo, si può fare questo se si fa profiling strumentazione (non campionamento):

  1. Aggiungi il tuo binario/progetto come un obiettivo in Performance Explorer
  2. pulsante destro del mouse sulla destinazione, fare clic su Proprietà
  3. Passare alla sezione Strumentazione, deselezionare "Escludi piccole funzioni ..."
  4. Passare alla sezione Avanzate, in "Opzioni di strumentazione aggiuntive", specificare i metodi che si desidera specificamente t o profilo (ad es. /include:ConsoleApp.Program::Main,MyNamespace.MyClass::MyFunc)

Il /include sintassi è un po 'strano, ma se si avvia un prompt dei comandi VS e andare nella directory del vostro binario, è possibile eseguire vsinstr.exe /dumpfuncs foo.exe per visualizzare l'elenco dei metodi in modo esplicito è possibile includere.

Vedere vsinstr.exe command-line syntax per ulteriori informazioni.

+0

ok, sembra un'alternativa interessante a quella qui sotto, grazie !! – rekna

Problemi correlati