Sembra che non ci siano profilatori di prestazioni .NET gratuiti * che possono eseguire il profilo linea per linea. Pertanto, sto cercando di utilizzare il cronometro per la creazione di profili.Profilatura di applicazioni .NET con Cronometro
* gratis come in libertà, cioè la licenza include applicazioni commerciali.
EDIT: In risposta a quelli che mi hanno detto "compra un profiler", mi piacerebbe, ma se potessi spendere tanti soldi lo spenderei su qualcos'altro. Ho cercato di convincere il mio capo che un profiler è valsa la pena, ma non ho avuto molta fortuna. Questa domanda è per lo più basata sulla curiosità. Non considererei mai il cronometro come sostituto di un vero profiler.
Ho una piccola app di test (scritta in C#) che misura le differenze di prestazioni quando si utilizza un cronometro su base per riga. Il codice di prova è questa:
int n = 100;
BigInteger f = 1;
for (int i = n; i > 1; i--)
{
f *= i;
}
Ecco il codice completo: http://pastebin.com/AvbQmT32
Ho un cronometro per ogni riga di codice. Questo è il mio 'profiler'. Ho anche un cronometro per l'intero programma. Questo è il mio 'profiler profiler'.
Ho il programma configurato come modalità di rilascio, qualsiasi CPU (su una macchina x64) e ottimizzazioni disabilitate.
Quando eseguo il programma con il profiler disabili, ottengo qualcosa di simile:
Line | Ticks
------------------------------|----------
|
Total time: | 359
Quando eseguo con il profiler abilitato, ottengo qualcosa di simile:
Line | Ticks
------------------------------|----------
|
int n = 100; | 3
BigInteger f = 1; | 12
for (int i = n; i > 1; i--) | 325
{ |
f *= i; | 539
} |
|
Total time: | 1710
Stopwatch overhead: | 831
Idealmente , il tempo speso per il codice dovrebbe essere uguale in entrambi i casi, ma sembra che i cronometri abbiano un sovraccarico che appare nel loro tempo trascorso.
Ora, spesso non ha senso dover profilare ogni riga di un programma, poiché di solito funziona meglio con un approccio divide et impera. In genere puoi iniziare a profilare blocchi di codice e restringere i problemi relativi alle prestazioni.
Inoltre, nella maggior parte delle applicazioni, la riga media del codice sarà molto più lenta di quelle del programma di test. Ciò significa che ci sarà meno sovraccarico del cronometro.
Tuttavia, c'è ancora un sovraccarico quando si usano i cronometri, specialmente se si usa molto.
Così fino alla domanda:
Qual è il modo più efficace per utilizzare cronometri per il profiling? Come posso minimizzare il sovraccarico? Vale la pena persino racchiudere un cronometro su una singola frase?
Apprezzo il vostro feedback.
Personalmente, i profiler ho acquistato (ANTS Profiler) erano vale ogni centesimo. Non penserei mai più alla profilazione "manuale". –
Siamo spiacenti di chiedere, ma perché non verificare l'utilizzo di alcune delle classi System.Diagnostics? Credo che contenga classi per verificare CPU e utilizzo di Ram, ad esempio. – Eon
La versione gratuita di EQATEC profiler permette il suo utilizzo in un progetto commerciale: http://www.eqatec.com/Profiler/LicenseTerms.aspx – ken2k