Zliczanie czasu wykonywania

Pisząc program często zastanawiamy się, czy to co napisaliśmy działa tak szybko, jak to możliwe, czy też można zrobić coś jeszcze, by program działał szybciej.

Żeby stwierdzić, czy udało się coś zrobić lepiej i program działa szybciej, to przede wszystkim trzeba umieć sprawdzić, ile czasu trwa wykonywanie programu albo jego części.

Załóżmy, że mamy w programie pętle, w której wykonujemy skomplikowane obliczenia, które długo trwają. Chcielibyśmy się dowiedzieć, jak długo trwa wykonywanie pętli. Okazuje się, że można to dość łatwo określić. Trzeba tylko zanotować czas rozpoczęcia i po zakończeniu obliczeń czas zakończenia.

package pl.coderion;

public class Main {

    public static void main(String[] args) {
       long czasRozpoczecia = System.currentTimeMillis();

       for (int i = 0; i < 1000_000; i++) {
            // pusta pętla
        }

       long czasZakonczenia = System.currentTimeMillis();

       long czasTrwania = czasZakonczenia - czasRozpoczecia;

       System.out.println("Czas trwania: " + czasTrwania);
    }
}

Zaczynamy od zapamiętania w zmiennej o nazwie czasRozpoczecia momentu rozpoczęcia obliczeń. W tym celu korzystamy z klasy System i jej metody currentTimeMillis(), która zwraca bieżącą datę wyrażoną w milisekundach (1 ms = 0,001 s). Wartość zwrócona przez tę funkcję to liczba milisekund, która upłynęła od umownej daty 1970-01-01 do teraz.

Potem występuje pętla, w ramach której odbywają się jakieś ważne obliczenia. W powyższym programie symbolizuje to pusta pętla FOR. Mimo iż jest ona pusta i nic takiego nie robi, to jednak ileś czasu zajmuje. Modyfikowana jest wartość licznika, następuje sprawdzenie czy pętla ma być wykonana. Zmieniając warunek zakończenia pętli na np. i < 1000_000_000 będzie można dostrzec, o ile dłużej wykonuje się pętla po zmianie.

Po zakończeniu obliczeń w podobny sposób zapamietujemy czas zakończenia (w zmiennej czasZakonczenia). Odejmując jedną wartość od drugiej otrzymujemy czas trwania pętli w milisekundach:

long czasTrwania = czasZakonczenia - czasRozpoczecia;

Czasem może okazać się, że to co mierzymy trwa bardzo krótko, poniżej jednej milisekundy. W takim przypadku czas trwania zawsze wskazywałby 0.

Dla operacji krótszych niż 1 milisekunda trzeba zapisywać czas z dokładnością do nanosekundy (1 ns = 0,000000001 s). W klasie System znajdziemy do tego odpowiednią metodę: nanoTime().

Instrukcji, w których do zmiennej będziemy przypisywać moment zakończenia możemy mieć w programie więcej. Porównując z poprzednio zanotowanym czasem zawsze będziemy w stanie określić, jak długo wykonywała się wybrana część programu.