2012-12-03 9 views
7

W tym przykładowym kodzie używam prosty stoper do testowania czasu potrzebnego do wykonania danego zadania/działaniaklasa Pomocnik dla testów wydajności z wykorzystaniem klasy stoper

StopWatch SW1 = new StopWatch(); 
SW1.Start(); 
SomeAction(); 
SW1.Stop(); 
sting results = SW1.Elapsed.ToString(); 
MessageBox.Show(resutls); 

chciałbym mieć klasę że ja będzie instancji do korzystania z testów

public Class PerformanceTests 
{ 
    public StopWatch SW1 = new StopWatch(); 
    public StopWatch SW2 = new StopWatch(); 
    public string results1 = "", results2 = ""; 
    .... 
    .... 
    //some other variables to use 
} 

chociaż podczas tworzenia instancji klasy i próbuje użyć SW1 nie pozwolił mi korzystać z jego metod. Co ja robię źle ?

PerformanceTests Ptst = new PerformanceTests(); 
Ptst.SW1. ... Start() is not accessible 

Aktualizacja

Dla reszty odpowiedzi, nie kopiować kod z mnie, jak ja tęsknię kapitalizowane stopwatch. Zamiast tworzyć instancję klasy Stopwatch, przypadkiem nie zwróciłem uwagi Visual Studio pytając, czy chcę utworzyć klasę dla mojego tak zwanego stopera, zamiast rzeczywistego Stopwatch .NET.

Tak więc, moja rada, należy zwrócić uwagę na sugerowane działania Visual Studio intellisense , mimo że powinny być takie same przez cały czas. Tylko upewnij się, że jesteś naprawdę doświadczony i znasz wszystkie lekcje na pamięć.

+0

'intelliSense' brzmi jak produkt Apple. Zmieniliśmy to i wiele odpowiedzi na – nawfal

+0

napisałam tutaj: http: // stackoverflow.com/questions/969290/exact-time-measurement-for-performance-testing/16157458 # 16157458 Zobacz również http://stackoverflow.com/questions/232848/wrapping-stopwatch-timing-with-a-delegate-or -lambda – nawfal

Odpowiedz

19

Oto proste klasy, który może pomóc na czas wykonywania bloku kodu pomiaru:

public class PerformanceTester : IDisposable 
{ 
    private Stopwatch _stopwatch = new Stopwatch(); 
    private Action<TimeSpan> _callback; 

    public PerformanceTester() 
    { 
     _stopwatch.Start(); 
    } 

    public PerformanceTester(Action<TimeSpan> callback) : this() 
    { 
     _callback = callback;    
    } 

    public static PerformanceTester Start(Action<TimeSpan> callback) 
    { 
     return new PerformanceTester(callback); 
    } 

    public void Dispose() 
    { 
     _stopwatch.Stop(); 
     if (_callback != null) 
      _callback(Result); 
    } 

    public TimeSpan Result 
    { 
     get { return _stopwatch.Elapsed; } 
    } 
} 

użytkowania (tylko owinąć blok kodu z użyciem z PerformanceTester):

using (var tester = new PerformanceTester()) 
{ 
    // code to test 
    MessageBox.Show(tester.Results.ToString()); 
} 

Jeśli zadeklarujesz zmienną tester przed using blok, następnie stoper zatrzyma się automatycznie po wyjściu using blok, a wyniki będą dostępne dla Ciebie:

PerformanceTester tester; 

using (tester = new PerformanceTester())  
    SomeAction(); 

MessageBox.Show(tester.Results.ToString()); 

Jeśli zdasz działania oddzwaniania do PerformanceTester, to akcja zostanie wywołana po zakończeniu using oświadczeniu i czas, jaki upłynął zostaną przekazane do callback:

using (PerformanceTester.Start(ts => MessageBox.Show(ts.ToString()))) 
    SomeAction(); 

można zadeklarować metodę, która będzie akceptować TimeSpan i procesowych wyniki:

private void ProcessResult(TimeSpan span) 
{ 
    // log, show, etc 
    MessageBox.Show(span.ToString()); 
} 

Wykorzystanie staje się bardzo czysty:

using (PerformanceTester.Start(ProcessResult)) 
    SomeAction(); 
+0

Strangley został zrobiony podczas, gdy brałem sugestię intelliSence zamiast używania statystyki i tworzyłem klasę, ponieważ jestem missSpelled (wielkie litery) * myślę, że powinno być! 'StopWatch()' !! (: dziękuję, bo bez tego pomyłki, nie miałbym szansy na zobaczenie twojej schludnej metody ext! +1 dla fajnej klasy – LoneXcoder

+0

dzięki temu, że pozwala ci również uniknąć użycia niezbędnego importu innych klas kropki .net w webformie aplikacji/winform. czy pomaga to w jakikolwiek sposób, mam na myśli to, że staram się mieć mniej, jak mogę "używać" stwierdzeń, oznacza mniej importów klasowych, czy ma to jakikolwiek wpływ, lub gdy ja się podaję klasa, używam wtedy klasy .net (System.diagnostics), więc nie ma znaczenia co najmniej w kwestii wynikowego rozmiaru aplikacji. – LoneXcoder

+0

jak zadeklarować tester z użycia (przed) można podać inny przykład jak w swoim komentarz poniżej twojej odpowiedzi "jeśli zadeklarujesz zmienną testera przed użyciem' bloku' ... "możesz poszerzyć trochę – LoneXcoder

1

ich upublicznienia zamiast private:

public class PerformanceTests 
    { 
     public StopWatch SW1 { get; set; } 

     public StopWatch SW2 { get; set; } 

     public string Results1 { get; set; } 

     public string Results2 { get; set; } 

     public PerformanceTests() 
     { 
      this.SW1 = new StopWatch(); 
      this.SW2 = new StopWatch(); 
     } 
    } 
0

ile używasz stoper zwyczaj klasa nie jest poprawna nazwa klasy spróbować Stopwatch pod nazw System.Diagnostics

Spróbuj:

public Class PerformanceTests 
{ 
    public Stopwatch SW1 = new Stopwatch(); 
    public Stopwatch SW2 = new Stopwatch(); 
    public string results1 = "", results2 = ""; 
    .... 
    .... 
    //some other variables to use 
} 
Powiązane problemy