Non c'è il banale modo per ottenere questo in esecuzione. NET. Tuttavia, il modo più semplice che ho trovato è quello di costruire sulla Enterprise Library che fornisce alcune funzionalità pronte all'uso per lavorare con i contatori delle prestazioni. Ad esempio: the Performance Counter Handler
La libreria Enterprise offre anche alcune funzionalità per una gestione molto più semplice dell'installazione di contatori delle prestazioni.
Inoltre, ti permette di costruire su di esso in modo, è possibile creare un AvergeTimeMeter che permette di fare solo questo:
private static EnterpriseLibraryPerformanceCounter averageRequestTimeCounter = PerformanceCounterManager.GetEnterpriseLibraryCounter(MadPerformanceCountersListener.AverageRequestTime);
private static EnterpriseLibraryPerformanceCounter averageRequestTimeCounterBase = PerformanceCounterManager.GetEnterpriseLibraryCounter(MadPerformanceCountersListener.AverageRequestTimeBase);
public void DoSomethingWeWantToMonitor()
{
using (new AverageTimeMeter(averageRequestTimeCounter, averageRequestTimeCounterBase))
{
// code here that you want to perf mon
}
}
Questo permette di incapsulare semplicemente il codice che si desidera monitorare in un usando il blocco - e concentrati sul codice su cui vuoi lavorare piuttosto che preoccuparti di tutta l'infrastruttura del contatore delle prestazioni.
Per fare questo, si creerà una classe riutilizzabile AverageTimeMeter come questo:
public sealed class AverageTimeMeter : IDisposable
{
private EnterpriseLibraryPerformanceCounter averageCounter;
private EnterpriseLibraryPerformanceCounter baseCounter;
private Stopwatch stopWatch;
private string instanceName;
public AverageTimeMeter(EnterpriseLibraryPerformanceCounter averageCounter, EnterpriseLibraryPerformanceCounter baseCounter, string instanceName = null)
{
this.stopWatch = new Stopwatch();
this.averageCounter = averageCounter;
this.baseCounter = baseCounter;
this.instanceName = instanceName;
this.stopWatch.Start();
}
public void Dispose()
{
this.stopWatch.Stop();
if (this.baseCounter != null)
{
this.baseCounter.Increment();
}
if (this.averageCounter != null)
{
if (string.IsNullOrEmpty(this.instanceName))
{
this.averageCounter.IncrementBy(this.stopWatch.ElapsedTicks);
}
else
{
this.averageCounter.SetValueFor(this.instanceName, this.averageCounter.Value + this.stopWatch.ElapsedTicks);
}
}
}
}
Devi registrare i contatori delle prestazioni (mostrati negli esempi EntLib), ma questo dovrebbe ottenere il vostro iniziato.
fonte
2010-10-09 09:27:44
Forse avrei dovuto elaborato che stavo cercando di implementare un semplice motore di Regex. Il cronometro sarà abbastanza preciso per quello? –
@Paul Matthews - andrà bene. La risoluzione del cronometro è espressa in tick – Oded
È sufficientemente accurata per misurare le prestazioni del tuo codice, se è quello che stai chiedendo. Ricorda di eseguire il codice in modalità di rilascio all'esterno di Visual Studio se stai misurando le prestazioni. Inoltre, ti consiglio di utilizzare un profiler per misurare le prestazioni, ti dirà molto di più sulle prestazioni del tuo codice rispetto a una semplice misurazione del tempo da punto a punto. – driis