Strona główna » Kursy » Kurs C# » Czas Wykonania
 

Czas Wykonania

Wstęp

Efektywny algorytm to taki, który w jak najkrótszym czasie zwraca żądany wynik. Warto dowiedzieć się jak mierzyć czas wykonania, aby określić przydatność algorytmu, albo znaleźć jego "wąskie gardło". W tym artykule zostanie przedstawiona klasa Stopwatch, która pozwala na bardzo precyzyjny pomiar czasu.

Definicja

Klasa Stopwatch znajduje się w przestrzeni System.Diagnostics. Jest to obiekt, który pozwala na uruchomienie pomiaru w dowolnym momencie, jego zatrzymanie oraz reset. Po zatrzymaniu otrzymuje się obiekt, który zawiera informację dotyczące upływu czasu. Można odczytać ile upłynęło np. sekund czy milisekund, albo sformatować wynik na własny sposób.

Zastosowanie

Przypuśćmy, że mamy funkcję GenerujTabliczke() do generowania tabliczki mnożenia. Zwraca ona dwuwymiarową tablicę, gdzie na pozycji (x, y) znajduje się iloczyn współrzędnych. Oto kod funkcji:

  1. static int[,] GenerujTabliczke(int n) {
  2.   int[,] tab = new int[n, n];
  3.   for(int x = 0; x < n; x++) {
  4.     for(int y = 0; y < n; y++) {
  5.       tab[x, y] = x * y;
  6.     }
  7.   }
  8.   return tab;
  9. }

W celu dokonania pomiaru należy utworzyć nowy obiekt Stopwatch, a następnie uruchomić go poleceniem Start(), wywołać funkcję i zatrzymać pomiar czasu metodą Stop(). Kod wyglądałby następująco:

  1. Stopwatch stopWatch = new Stopwatch();
  2. stopWatch.Start();
  3. int[,] wynik = GenerujTabliczke(100);
  4. stopWatch.Stop();

Stoper został zatrzymany. Teraz wystarczy odczytać czas, który został zmierzony. Służy do tego właściwość Elapsed, która jest typu TimeSpan. Taki obiekt można od razu sformatować na tekst, aby odczytać dokładny czas. Przykładowo następująca linijka:

  1. Console.WriteLine(stopWatch.Elapsed);
  2. Console.ReadKey();

może wypisać na ekran:

  1. 00:00:00.0011192

Domyślny format wypisywanego czasu to kolejno godziny, minuty, sekundy oraz milisekundy, które upłynęły.

Klikacz

Jak szybko potrafisz czytelniku wciskać przyciski na klawiaturze? Otóż można to sprawdzić pisząc krótki kod w języku C#. Poniższy kod zbiera informację o czasie, który upłynął pomiędzy kolejnymi wciśnięciami na klawiaturze. Reaguje na dowolny przycisk.

  1. static void Main(string[] args) {
  2.   Stopwatch stopWatch = new Stopwatch();
  3.   TimeSpan min = new TimeSpan(long.MaxValue);
  4.   TimeSpan max = new TimeSpan(0);
  5.   Console.WriteLine("Min.\t\t\tTeraz\t\t\tMax.");
  6.   Console.Write("Rozpocznij wciskanie guzików...");
  7.   Console.ReadKey();
  8.   while (true) {
  9.     stopWatch.Reset();
  10.     stopWatch.Start();
  11.     Console.ReadKey();
  12.     stopWatch.Stop();
  13.     if (min > stopWatch.Elapsed) {
  14.       min = stopWatch.Elapsed;
  15.     } else if(stopWatch.Elapsed > max) {
  16.       max = stopWatch.Elapsed;
  17.     }
  18.     Console.Write("\r{0}\t{1}\t{2} ", min, stopWatch.Elapsed, max);
  19.   }
  20. }

Podczas działania pętli zczytywane są kolejne czasy wciśnięcia przycisków. Następnie aktualizowane są wartości minimalne oraz maksymalne czasu, a następnie wypisywane krótkie podsumowanie.

Zadania
Zadanie 1
Kod źródłowy Zadanie 1Kod źródłowy Zadanie 1