Przy pisaniu zapytań SQL sprawdzanie statystyk wykonania to sprawa podstawowa. Pomiar ilości odczytów, pomiar czasu procesora i rzecz kluczowa pomiar czasu wykonania.

Jest to ważne. Te same wyniki możemy otrzymać pisząc różne zapytania, które zostaną wykonanie mniej lub bardziej wydajnie. Nie inaczej jest w PowerShell, z jedną różnicą, że rzadko…

dbamy o pomiar?

Po co? Nie widzimy powodów aby to robić. Najważniejsze, że działa a po drugie czy coś trwa minutę, czy 5, jeszcze nie robi nikomu różnicy. W takim razie kiedy powinniśmy myśleć o pomiarze wykonania skryptów PowerShell?

Wykonuje się bardzooo długo

Jakiś czas temu otrzymałem wiadomość z pytaniem. Mam pętlę, która „wykonuje się bardzo długo i nie wiem dlaczego”. Właśnie w takich sytuacjach przydaje się pomiar, który może pomóc wychwycić miejsca problematyczne.

3 sposoby na pomiar czasu wykonania

Measure-Command

Natywne polecenie które umożliwi Ci łatwe użycie i szybki pomiar. Wystarczy, że owiniesz swój kod w blok skryptu {} który będzie wartością dla parametru Expression.

Uwaga, nasz skrypt się wykona w tle ale wyników jego działania nie zobaczymy na „ekranie”. To nie wada, tak to działa.

Wyliczanie różnic czasu

Czasochłonna metoda. Wymaga od nas, w wybranych miejscach skryptu zachowania do zmiennej daty. Następnie wyliczania różnicy w celu uzyskania rezultatu.

Lepiej wykorzystaj następny sposób.

System.Diagnostics.Stopwatch

Najlepszym według mnie sposobem na pomiar jest wykorzystanie klasy [Stopwatch] który swoim działaniem przypomina stoper. Na początku tworzysz instancję klasy [System.Diagnostics.Stopwatch] i uruchamiasz stoper metodą startNew(). Obiekt tej klasy ma własność Elapsed, której wartość rośnie do czasu wywołania metody Stop (lub Restart)

Jest to o tyle wygodne, że możesz śledzić czas, jaki upłyną pomiędzy fragmentami kodu, poprzez sprawdzanie własność Elapsed. Ułatwia to identyfikację czaochłonnych sekcji skryptu, które można próbować poprawiać.

PowerShell Pro Tools

W Visual Studio Code, którego używam zamiast PowerShell ISE dostępne jest rozszerzenie PowerShell Pro Tools, które ma pomagać między innymi w analizie wydajności skryptów.

Sam jeszcze się temu przyglądam i wspominam o tym jako ciekawostka. Zobacz, jak to mniej więcej działa.

Wygląda dobrze, niestety nie zawsze działa jak należy i ma swoją (niewysoką) cenę. Więcej o rozwiązaniu znajdziesz tutaj.

Podsumowanie

Pomiar czasu wykonania skryptów nie jest czymś, o czym myślimy w pierwszej kolejności. Jednak może się przydać np. przy wykonywaniu refaktoring kodu, do sprawdzenia efektów zmian.

W zależności od potrzeby sięgam po inne metody. Measure-Command, gdy potrzebuję porównać czasy wykonania dwóch poleceń lub instrukcji. Klasy Stopwatch, gdy chcę znaleźć miejsce w skrypcie, które może mieć potencjał do poprawy.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

Mateusz Nadobnik

Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

read more