Historia pytania
W miarę jak programy stawały się bardziej skomplikowane i obciążenie rosło, programiści Perl zaczęli odczuwać potrzebę analizy wąskich gardeł i optymalizacji skryptów. W tym celu stworzono wbudowane profilerki, takie jak Devel::NYTProf, Devel::DProf oraz różne metody ręcznego pomiaru za pomocą Benchmark.
Problem
Główną trudnością jest to, że Perl jest znany ze swojej dynamiki i elastyczności, co wprowadza dodatkowe koszty (interpretacja kodu w locie, częste konwersje typów, niskopoziomowa praca z pamięcią, autowifiwifikacja struktur). Nie jest oczywiste, który fragment kodu staje się najwolniejszy, gdyż często wąskie gardło znajduje się nie tam, gdzie szuka programista. Mylnym podejściem jest przedwczesna optymalizacja bez rzeczywistego profilowania.
Rozwiązanie
Należy stosować profiler, budować raporty, pracować ze statystykami. NYTProf dostarcza najbardziej szczegółowych informacji, wspiera analizę graficzną. Do niektórych punktowych pomiarów używane są Benchmark::Timer lub time. Kod optymalizuje się na podstawie wyników — na przykład, przepisuje się zbędną logikę, usuwa nadmiarowe kopiowania tablic, wprowadza się powłoki XS dla krytycznych miejsc.
Przykład kodu:
# profilowanie przez Devel::NYTProf perl -d:NYTProf myscript.pl nytprofhtml # raport HTML z szczegółami
Kluczowe cechy:
Czy profiler zawsze wskaże dokładny powód spowolnienia w każdym fragmencie?
Nie. Profiler może w pewnych przypadkach zniekształcać obraz, szczególnie jeśli analizowane są rzadko wywoływane funkcje lub gdy praca toczy się z zasobami zewnętrznymi (Baza Danych, sieć).
Czy można twierdzić, że wiązanie XS zawsze daje maksymalny przyrost wydajności?
Nie zawsze. XS przyspiesza tylko intensywne obliczeniowo fragmenty, ale jeśli wąskim gardłem jest I/O lub struktura danych, przyrost będzie minimalny.
Czy zawsze należy przepisywać najwolniejsze funkcje w C lub XS po pierwszej analizie?
Nie. Często lepiej zmienić algorytm lub sposób przechowywania danych (autowifiwifikacja vs prealokacja, tablica vs hash), niż od razu przechodzić do niskopoziomowej optymalizacji.
Programista losowo przyspiesza funkcje, przepisuje je w XS, ale nie zauważa profesjonalnego wzrostu wydajności, ponieważ główne wąskie gardło znajdowało się w wielokrotnym czytaniu plików.
Zalety:
Wady:
Przeprowadzenie profilowania za pomocą NYTProf, zidentyfikowanie rzeczywistych wolnych fragmentów, optymalizacja tylko tych, w reszcie przepisanie algorytmu na bardziej efektywny. Miejsce stosunków uczestników kodu pokazało, gdzie były zbędne kopie tablic.
Zalety:
Wady: