Profilowanie i optymalizacja
Wczoraj na blogu opisywałem rozwiązanie zadania „Misja Gynvaela 008”, jednak o ile udało się wygenerować mapę i odczytać hasło, to czas przetwarzania plików był stanowczo zbyt długi. Postanowiłem przyjrzeć się temu ponownie i postarać się coś przyśpieszyć.
Profilowanie
Pierwszym krokiem będzie sprawdzenie za pomocą narzędzia Blackfire co stanowi tzw. wąskie gardło, czyli jaka czynność trwa najdłużej. Ograniczyłem więc główną pętlę klasy Solver, tak aby przetwarzała ona jedynie 10 plików, następnie odpaliłem blackfire.
1
blackfire run php solver.php
Okazało się, że przetworzenie 10 plików trwa aż 6.31s, a wąskie gardło stanowi funkcja imagejpeg wywoływana aż 275 razy.
Optymalizacja
Nie ma potrzeby, aby plik mapy był zapisywany po każdym dodaniu punktu. Przerobiłem więc kod tak, aby przed główną pętlą w klasie Solver utworzyć obraz, a następnie po jej zakończeniu go zapisać. Dokładne zmiany można sprawdzić tutaj. Kolejne sprawdzenie za pomocą narzędzia blackfire przyniosło już zadowalający rezultat.
Obecnie przetworzenie wszystkich danych i narysowanie mapy zajmuje jakieś 80-90 sekund.
1
Parsed 187812 files in 83 seconds