Nie ma sposobu, aby uzyskać to i działa w .NET. Jednak najprostszym sposobem, jaki udało mi się znaleźć, jest zbudowanie na bazie biblioteki Enterprise, która zapewnia trochę gotowości do pracy z licznikami wydajności. Na przykład: the Performance Counter Handler
Biblioteka korporacyjna zapewnia również pewne możliwości znacznie łatwiejszego zarządzania instalacją liczników wydajności.
Dodatkowo niech zbudować na nim tak, można utworzyć AvergeTimeMeter który pozwala po prostu to zrobić:
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
}
}
Pozwala to po prostu hermetyzacji kodu chcesz monitorować w sposób używając bloku - i skoncentruj się na kodzie, nad którym chcesz pracować, zamiast martwić się o całą infrastrukturę licznika wydajności.
Aby to zrobić, musisz utworzyć wielokrotnego użytku klasę AverageTimeMeter takiego:
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);
}
}
}
}
musisz zarejestrować swoje liczniki wydajności (pokazane na przykładach EntLib), ale powinien dostać swoją zaczęło.
Być może powinienem był opracować, że próbowałem wdrożyć prosty silnik Regex. Czy stoper będzie na tyle dokładny? –
@Paul Matthews - będzie dobrze. Rozdzielczość stopera jest w kleszczach – Oded
Jest wystarczająco dokładna do mierzenia wydajności twojego kodu, jeśli o to pytasz. Pamiętaj, aby uruchamiać kod w trybie Release poza Visual Studio, jeśli mierzysz wydajność. Zaleciłbym również użycie narzędzia do profilowania w celu zmierzenia wydajności, o wiele więcej dowiesz się o wydajności kodu niż prosty pomiar czasu do punktu. – driis