2013-08-08 15 views
9

Mam krótki kod, który wykonuje różne operacje i chcę zmierzyć czas potrzebny na ich wykonanie. Czytałem tutaj o klasie Stopwatch i chciałem zoptymalizować moje pomiary czasu. moje funkcje zwraca 5 innych funkcji i chcę zmierzyć każdy bez wypowiedzenia:Jak korzystać z StopWatch wiele razy w języku C#?

stopwatch sw1 = new stopwatch(); 
stopwatch sw2 = new stopwatch(); 
etc.. 

moja funkcja wygląda tak:

public bool func() 
{ 
.... 
func1() 
func2() 
.... 
.... 
func5() 
} 

jest jakiś sposób, aby zmierzyć czas za pomocą jednego stopera instancji?

dzięki!

Odpowiedz

17

Zastosowanie delegaci zdać metoda jako parametr funkcji.

Tutaj użyłem Delegatów akcji, ponieważ określone metody nie zwracają wartości.

Można go odpowiednio zmodyfikować, jeśli metoda ma typ zwracanej lub parametru za pomocą funkcji delegata

static void Main(string[] args) 
    { 
     Console.WriteLine("Method 1 Time Elapsed (ms): {0}", TimeMethod(Method1)); 
     Console.WriteLine("Method 2 Time Elapsed (ms): {0}", TimeMethod(Method2)); 
    } 

    static long TimeMethod(Action methodToTime) 
    { 
     Stopwatch stopwatch = new Stopwatch(); 
     stopwatch.Start(); 
     methodToTime(); 
     stopwatch.Stop(); 
     return stopwatch.ElapsedMilliseconds; 
    } 

    static void Method1() 
    { 
     for (int i = 0; i < 100000; i++) 
     { 
      for (int j = 0; j < 1000; j++) 
      { 
      } 
     } 
    } 

    static void Method2() 
    { 
     for (int i = 0; i < 5000; i++) 
     { 
     } 
    } 
} 

Stosując tę ​​można przekazać dowolnej metody chcesz.

Nadzieję, że pomaga!

4

Tak, spróbuj tego:

void func1() 
    { 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     func1(); 
     sw.Stop(); 
     Console.Write(sw.Elapsed); 

     sw.Restart(); 
     func2(); 
     sw.Stop(); 
     Console.Write(sw.Elapsed); 
    } 
+0

wielkie dzięki! – user1386966

+0

Czy jest jakaś różnica między zapisaniem sw.Restart i sw.Start w tym przypadku? – user1386966

+2

Użyj przycisku Uruchom ponownie, aby zatrzymać bieżący pomiar interwału i rozpocząć nowy pomiar interwału (MSDN). Ponowne uruchomienie spowoduje skasowanie upływu czasu. – oakio

4

Co trzeba jest Restart funkcją Stoper klasie, coś takiego:

public bool func() 
{ 
    var stopwatch = Stopwatch.StartNew(); 

    func1(); 

    Debug.WriteLine(stopwatch.ElapsedMilliseconds); 

    stopwatch.Restart(); 

    func5(); 

    Debug.WriteLine(stopwatch.ElapsedMilliseconds); 
} 
1

można wykorzystywać tę małą klasę:

public class PolyStopwatch 
{ 
    readonly Dictionary<string, long> counters; 

    readonly Stopwatch stopwatch; 

    string currentLabel; 

    public PolyStopwatch() 
    { 
     stopwatch = new Stopwatch(); 
     counters = new Dictionary<string, long>(); 
    } 

    public void Start(string label) 
    { 
     if (currentLabel != null) Stop(); 

     currentLabel = label; 
     if (!counters.ContainsKey(label)) 
      counters.Add(label, 0); 
     stopwatch.Restart(); 
    } 

    public void Stop() 
    { 
     if (currentLabel == null) 
      throw new InvalidOperationException("No counter started"); 

     stopwatch.Stop(); 
     counters[currentLabel] += stopwatch.ElapsedMilliseconds; 
     currentLabel = null; 
    } 

    public void Print() 
    { 
     if (currentLabel != null) Stop(); 

     long totalTime = counters.Values.Sum(); 
     foreach (KeyValuePair<string, long> kvp in counters) 
      Debug.Print("{0,-40}: {1,8:N0} ms ({2:P})", kvp.Key, kvp.Value, (double) kvp.Value/totalTime); 
     Debug.WriteLine(new string('-', 62)); 
     Debug.Print("{0,-40}: {1,8:N0} ms", "Total time", totalTime); 
    } 
} 

używać go tak:

var ps = new PolyStopwatch(); 

ps.Start("Method1"); 
Method1(); 
ps.Stop(); 

// other code... 

ps.Start("Method2"); 
Method2(); 
ps.Stop(); 

ps.Print(); 

Jeśli połączenia następują jedna po drugiej, można pominąć stop()

ps.Start("Method1"); 
Method1(); 
ps.Start("Method2"); 
Method2(); 
ps.Print(); 

Działa dobrze z pętlą:

for(int i = 0; i < 10000; i++) 
{ 
    ps.Start("Method1"); 
    Method1(); 
    ps.Start("Method2"); 
    Method2(); 
} 
ps.Print();