Optymalizacja kodu to czasochłonny i trudny temat. Przede wszystkim musimy znaleźć miejsca w aplikacji, które „pochłaniają” większość czasu procesora lub zajmują dużo pamięci. Aby to zrobić potrzebujemy narzędzia, które przygotuje nam profil wywołań metod/funkcji naszej aplikacji. W tym celu przedstawione zostanie narzędzie blackfire.io
Blackfire.io dostępne jest do pobrania z oficjalnej strony: https://blackfire.io/ Jest to narzędzie płatne, jednak istnieje opcja darmowego użytkowania, mocno ograniczona ale pozwalająca na podstawowe optymalizacje naszego kodu.
Po zainstalowaniu i sprawdzeniu poprawnego działania (wg instrukcji na stronie producenta) możemy przystąpić do stworzenia pierwszego profilu naszej aplikacji. Załóżmy, że chcemy sprawdzić co obciąża naszą stronę główną. Wywołujemy polecenie:
blackfire curl –samples=10 „http://localhost/”
Gdzie parametr ‘samples’ mówi o tym ile razy chcemy wywołać dany adres.
Po zakończeniu profilowania w konsoli wyświetli nam się krótkie podsumowanie. Nie to jest jednak najważniejsze. Przechodzimy na dashboard znajdujący się na stronie blackfire.io i wybieramy profil który powinien tam się pojawić:
Po lewej widzimy listę wywołań metod wraz z ich czasami. Listę tą możemy posortować wg czasu wywołania wliczającego podwywołania (incl.) lub wg czasu własnego wywołania (excl.) co jest bardziej dla nas interesujące ponieważ pokazuje jak długo konkretna metoda działa. Po prawej widzimy drzewo wywołań, gdzie kolorem czerwonym podkreślone są wywołania/ścieżki zajmujące najwięcej czasu żądania.
W tym przypadku widzimy, że funkcja curl_exec zajmowała średnio 3s czasu z każdego z naszych 10 pomiarów. Widzimy również że znaczna większość tego czasu poświęcona została dla GeoLocalizationService. Nie wdając się w szczegóły i zasadność rozwiązania, spróbujmy „zoptymalizować” to miejsce (dla przykładu usuwając to wywołanie :D). Robimy to i profilujemy kod ponownie:
Widzimy znaczną poprawę, curl_exec zajmuje w tym momencie tylko 250 ms. Oczywiście sama optymalizacja jest nie do końca właściwa (nie powinniśmy optymalizować przez usunięcie funkcjonalności :D), natomiast pokazuje jako przykład poprawne wykorzystanie blackfire.
Dodatkowym atutem tego narzędzia jest możliwość czytelnego pokazania zmian pomiędzy dwoma profilami:
Osobiście zachęcam do spróbowania przynajmniej raz z blackfire w celu optymalizacji. Jeżeli nie chcemy bawić się w zakładanie kont/instalowanie zewnętrznych narzędzi, dobrą alternatywą może być wbudowany w xdebug profiler (xdebuga chyba każdy ma) + dodatkowo narzędzie qcachegrind do wyświetlania profili.
Dodam, że blackfire bardzo pomógł nam w optymalizacji sklepu w ramach projektu „Struś pędziwiatr”.
Autorem tekstu jest Adam Tront