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
Subscribe and master unit testing with my FREE eBook (+60 pages)! 🚀
Effective testing is key to building reliable software. From unit to end-to-end tests, well-designed tests ensure your implementation is correct and robust.
In this ebook, discover simple, actionable tips to improve your testing and maximize its impact.
+500 subscribers


