Articles

Xcode Instruments wykorzystanie do poprawy wydajności aplikacji

Xcode Instruments jest narzędziem deweloperskim, który jest dostarczany za darmo z Xcode. Posiada wiele przydatnych narzędzi do sprawdzania i ulepszania aplikacji. Chociaż ma wiele do zaoferowania, często jest to obszar, który jest nieco mniej znany.

W tym wpisie na blogu pokażę Ci, jak poprawiłem wydajność w kluczowej części aplikacji Collect by WeTransfer za pomocą Xcode Instruments. Aby dać Ci wyobrażenie o rezultatach, oto wynik przed i po, w którym część po „Importowaniu zdjęć” została drastycznie poprawiona:

ViRE – Visual Regular Expressions (Mac & iPad)ViRE jest narzędziem Visual Regular Expressions: Readable Regex – Code Complete / Cheat Sheet – Unit Tests – Powerful Replace System – Step-by-Step Search & Replace – Regex Visual Scheme – Regex History / Playground. ViRE jest dostępny na Mac & iPad.

Jak widać, popup importu pokazuje o wiele dłużej w starej wersji, podczas gdy końcowy arkusz akcji jest również znacznie opóźniony.

Im lepsza jest ta część w twojej aplikacji, tym lepiej działa twoja aplikacja.

Czas się zanurzyć i zobaczyć, jak poprawiliśmy ten przepływ!

Co to jest Xcode Instruments?

Xcode Instruments jest najlepiej opisany jako potężne i elastyczne narzędzie do analizy wydajności i testowania. Jest ono częścią zestawu narzędzi Xcode, który zawiera również narzędzia takie jak Create ML i Inspektor dostępności.

Instrumenty mogą być używane do:

  • Śledzenia problemów w kodzie źródłowym
  • Analizy wydajności aplikacji
  • Wykrywania problemów z pamięcią

I wiele więcej!

Jak mogę uzyskać dostęp do instrumentów Xcode?

Możesz uzyskać dostęp do instrumentów za pomocą Product ➔ Profile z menu Xcode, dla którego uchwyt skrótu to ⌘ + I. Spowoduje to przebudowanie produktu i otworzy przegląd Instrumentów Xcode.

Xcode Instruments Overview
Przegląd Instrumentów Xcode

Czy powinienem wiedzieć, jak używać każdego z instrumentów?

Przegląd, który pokazuje 17 różnych instrumentów, może być dość przytłaczający. Każdy z nich może być bardzo cenny, ale na pewno nie są one potrzebne dla każdej aplikacji. Niektóre z nich, jak np. narzędzie Game Performance, jest wartościowe tylko wtedy, gdy tworzysz gry.

Warto jednak zagłębić się w dostępne instrumenty i wiedzieć, które z nich są dostępne. Możesz trafić na problem, który może być doskonale rozwiązany przez jeden z dostępnych instrumentów.

Czy mogę używać instrumentów w symulatorze?

Mimo, że większość instrumentów może być uruchomiona na symulatorze, nie zawsze jest to zalecane. Fizyczne urządzenie pokaże bardziej realistyczne wyniki i dlatego jest zalecane do użycia.

Użycie Xcode Instruments Time Profile do zbadania i poprawy wydajności

Instrument Time Profiler daje wgląd w procesory systemu i jak efektywnie wykorzystywane jest wiele rdzeni i wątków. Im lepsza jest ta część aplikacji, tym lepiej działa Twoja aplikacja.

W przykładzie wydajności aplikacji Collect, mieliśmy na celu przyspieszenie przepływu dodawania treści do naszej aplikacji. Time Profiler jest naszym punktem wyjścia do uzyskania wglądu w to, która część kodu może zostać zoptymalizowana.

Tworzenie nowego nagrania przy użyciu instrumentu Time Profiler

Po wybraniu instrumentu Time Profiler możemy rozpocząć nowe nagranie, naciskając czerwony przycisk w lewym górnym rogu lub używając ⌘ + R. Spowoduje to uruchomienie aplikacji w wybranym urządzeniu, po czym można rozpocząć przepływ.

Po zakończeniu przepływu, który chcesz poprawić, możesz zatrzymać nagrywanie i zanurzyć się w wynikach. Najpierw chcemy wiedzieć, jak używany jest główny wątek. UI blokuje się, gdy na głównym wątku dzieje się dużo pracy, co jest dokładnie tym problemem, którego doświadczamy w naszej aplikacji Collect.

Używanie filtrów do tworzenia przeglądu wątków

Pasek filtrów może być użyty do zawężenia przeglądu i uzyskania lepszego wglądu w używane wątki poprzez wybranie zakładki Threads. Przewijanie w dół pokazuje, że nasz główny wątek jest mocno wykorzystywany, podczas gdy inne wątki nie są tak zajęte:

Time Profiler main thread usage insights in Xcode Instruments
Time Profiler main thread usage

Identyfikacja, którą część kodu można zoptymalizować

Użycie ⌘ + D spowoduje otwarcie obszaru Detail, jeśli nie jest on jeszcze widoczny. Pokazuje on nazwy symboli dla podświetlonego okresu. W poprzednim przykładzie widać, że szczyty na wykresie są podświetlone na niebiesko. To samo można zrobić, klikając i przeciągając część, którą chcemy zbadać.

Na początku wygląda to dość nieprzydatnie, patrząc na nazwy symboli w obszarze szczegółów:

Unclear symbol names in the detail area
Nieczytelne nazwy symboli w obszarze szczegółów

Mimo że prawa strona obszaru szczegółów pokazuje najcięższy ślad stosu, możemy użyć filtru wejściowego Drzewo połączeń, aby uzyskać jeszcze lepszy przegląd. To również poprawi widok najcięższego śladu stosu poprzez ukrycie niektórych symboli.

Hide system libraries in the detail area
Ukryj biblioteki systemowe w obszarze szczegółów

Zaczynamy od Ukryj biblioteki systemowe, co spowoduje usunięcie wszystkich symboli niższego poziomu, które nie są pod naszą kontrolą i nie mogą być zoptymalizowane przez nas w żaden sposób. Jak widać, przegląd Heaviest Stack Trace jest teraz o wiele czystszy.

Następnym krokiem jest filtr Invert Call Tree, który sprawi, że metody najwyższego poziomu będą widoczne bez konieczności klikania przez każde drzewo wywołań. W połączeniu z sortowaniem w kolumnie Weight, możemy dokładnie zobaczyć, które metody powinny zostać zoptymalizowane.

Time Profile input filters to narrow down the results
Filtry wejściowe profilu czasu, aby zawęzić wyniki

Jasno widać, że nasz kod PHImageManager radzi sobie najgorzej, ponieważ zajmuje 3,36 sekundy z całkowitych 11,16 sekund. Okazało się, że możemy dość łatwo przenieść to do wątku tła i odciążyć główny wątek dla tej części.

Inną rzeczą, którą zauważyliśmy jest BucketHeaderView, który cały czas przelicza swoją wysokość, mimo że nic z nim nie robiliśmy w testowanym przepływie. Okazało się, że rzeczywiście nie musieliśmy tego robić.

Walidacja wyników

Po poprawieniu kodu nadszedł czas na ponowne uruchomienie Time Profiler i walidację wyników, aby upewnić się, że rzeczywiście został on poprawiony.

Validating results in the time profiler
Weryfikacja wyników w profilerze czasu

Pomimo, że sami widzieliśmy już poprawę na wcześniej udostępnionym filmie przed i po, teraz możemy również zobaczyć, że ten sam przepływ nie zawiera już PHImageManager jako najcięższego śladu stosu. Jest to potwierdzenie, że nasza zmiana kodu zadziałała.

Nagłówek również nie jest już przeliczany, a wydajność naszego przepływu została poprawiona.

ViRE – Visual Regular Expressions (Mac & iPad)ViRE jest narzędziem Visual Regular Expressions: Readable Regex – Code Complete / Cheat Sheet – Unit Tests – Powerful Replace System – Step-by-Step Search & Replace – Regex Visual Scheme – Regex History / Playground. ViRE jest dostępny na Mac & iPad.

Conclusion

Xcode Instruments zawiera wiele cennych narzędzi do poprawy wydajności Twojej aplikacji. Time Profiler może być używany do nurkowania do pewnego przepływu, poprawić kawałek kodu, i walidacji tuż po.

Poświęć trochę czasu, aby zanurkować w dostępnych instrumentów, dzięki czemu wiesz, które są przydatne, kiedy i rozpocząć poprawę swojej aplikacji. Jeśli jesteś na poprawę, nawet więcej, może chcesz przeczytać mój wpis na blogu na temat poprawy wydajności budowania, jak również!