Jak mierzyć czas wykonywania kodu?

przez | 2 września 2021

Twoja aplikacja działa wolno? Pewnie szukasz sposobu na sprawdzenie, który fragment kodu za to odpowiada. Komentowanie odpowiednich fragmentów to jeden ze sposobów na znalezienie winnego ale jest to czasochłonne i nieefektywne. W tym artykule dowiesz się jak zmierzyć czas wykonywania kodu.

Czy korzystanie z obiektu Date jest dobre?

Oczywiście, że tak. Dla wielu programistów może to być najprostszy sposób na mierzenie czasu. Obiekt Date, a dokladnie metoda getTime pozwala nam na pobranie aktualnej wartości czasu w milisekundach, który upłynął od 1 stycznia 1970 roku.

Ok, ale jak zmierzyć czas? Przed wykonaniem kodu przypisujemy do zmiennej aktualną wartość, następnie wykonujemy kod, a całość kończymy wyświetleniem różnicy pomiędzy aktualnym czasem a wcześniej przypisanym w konsoli:

const startTime = new Date().getTime();
[Twój kod]
console.log(new Date().getTime() - startTime);

Powyższe rozwiązanie ma minusy z których najważniejszym jest ograniczenie metody getTime do milisekund. Problem ten rozwiązuje obiekt Performance, który umożliwia obliczanie czasu co do mikrosekundy.

Obiekt Performance

Pierwszy ze sposobów na obliczenie czasu przy wykorzystaniu Performance jest podobna do poprzedniego przykładu – zamiast użycia metody getTime możesz użyć performance.now().

const startTime = performance.now();
let sum = 1;
for (let i = 0; i < iteration; i++) {
  sum += i;
}
console.log(performance.now() - startTime);

Bardziej zaawansowanym sposobem jest wykorzystanie metody measure, która pozwala nam mierzyć czas pomiędzy wieloma fragmentami kodu.

const markerNameA = 'marker-a';
const markerNameB = 'marker-b';
const markerNameC = 'marker-c';
sum = 1;
performance.mark(markerNameA);
for (let i = 0; i < iteration; i++) {
  sum += i;
}
performance.mark(markerNameB);
for (let i = 0; i < iteration; i++) {
  sum += i;
}
performance.mark(markerNameC);

performance.measure('a-b', markerNameA, markerNameB);
performance.measure('b-c', markerNameB, markerNameC);
performance.measure('a-c', markerNameA, markerNameC);

console.log(performance.getEntriesByType('measure'));
console.log(performance.getEntriesByName('a-b'));
console.log(performance.getEntriesByName('b-c'));
console.log(performance.getEntriesByName('a-c'));

performance.clearMarks();
performance.clearMeasures();

Korzystając z metody mark oznaczamy markerami kolejne miejsca w kodzie, pomiędzy którymi chcemy zmierzyć czas (odpowiednik przypisania getTime do zmiennej w poprzednim przykładzie). Następnie wykorzystując metodę measure wyznaczamy czasy pomiędzy konkretnymi markerami.

Metoda measure przyjmuje do trzech argumentów. Poza mierzeniem czasu wykonywania kodu pomiędzy konkretnymi markerami, możemy również zmierzyć czas od początku działania skryptu do aktualnego momentu poprzez wywołanie: performance.measure('your-name') oraz od początku działania skryptu do konkretnego znacznika: performance.measure('start to b', undefined, markerNameB).

Za pomocą metody getEntriesByType('measure') możemy pobrać wszystkie zmierzone czasy, a metoda getEntriesByName pozwoli nam pobrać konkretny obiekt zawierający czas trwania operacji.

Jeśli znasz inne metody na mierzenie czasu wykonywania kodu, daj znać w komentarzu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *