Articles

Verwendung von Xcode Instruments zur Verbesserung der App-Leistung

Xcode Instruments ist ein Entwickler-Tool, das kostenlos mit Xcode geliefert wird. Es bietet viele nützliche Werkzeuge, um Ihre App zu überprüfen und zu verbessern. Obwohl es viel zu bieten hat, ist es oft ein Bereich, der etwas weniger bekannt ist.

In diesem Blogbeitrag zeige ich Ihnen, wie ich die Leistung in einem wichtigen Teil der Collect by WeTransfer-App mithilfe von Xcode Instruments verbessert habe. Um Ihnen einen Eindruck von den Ergebnissen zu vermitteln, sehen Sie hier das Vorher-Nachher-Ergebnis, bei dem der Teil nach „Fotos importieren“ drastisch verbessert wurde:

ViRE – Visual Regular Expressions (Mac & iPad)ViRE ist ein Tool für visuelle reguläre Ausdrücke: Lesbare Regex – Code Complete / Cheat Sheet – Unit Tests – Leistungsstarkes Ersetzungssystem – Schritt-für-Schritt Suche & Ersetzen – Regex Visual Scheme – Regex History / Playground. ViRE ist auf Mac & iPad verfügbar.

Wie du sehen kannst, wird das Import-Popup in der alten Version viel länger angezeigt, während das endgültige Share Sheet ebenfalls stark verzögert wird.

Je besser dieser Teil in deiner App ist, desto besser funktioniert deine App.

Zeit, um einzutauchen und zu sehen, wie wir diesen Ablauf verbessert haben!

Was ist Xcode Instruments?

Xcode Instruments lässt sich am besten als leistungsstarkes und flexibles Tool für Leistungsanalysen und Tests beschreiben. Es ist Teil des Xcode-Toolset, zu dem auch Tools wie Create ML und der Accessibility Inspector gehören.

Die Instrumente können verwendet werden, um:

  • Probleme in Ihrem Quellcode aufzuspüren
  • Die Leistung Ihrer Anwendung zu analysieren
  • Speicherprobleme zu finden

Und vieles mehr!

Wie kann ich auf die Xcode-Instrumente zugreifen?

Sie können auf die Instrumente zugreifen, indem Sie Product ➔ Profile aus dem Xcode-Menü verwenden, für das der Tastaturkurzbefehl ⌘ + I lautet. Dadurch wird Ihr Produkt neu erstellt und die Übersicht über die Xcode-Instrumente geöffnet.

Xcode Instruments Overview
Übersicht über die Xcode-Instrumente

Sollte ich wissen, wie jedes Instrument zu verwenden ist?

Eine Übersicht, die 17 verschiedene Instrumente zeigt, kann ziemlich überwältigend sein. Jedes von ihnen kann sehr wertvoll sein, aber sie werden definitiv nicht für jede Anwendung benötigt. Einige von ihnen, wie das Game Performance Instrument, sind nur wertvoll, wenn man Spiele entwickelt.

Es lohnt sich aber, in die verfügbaren Instrumente einzutauchen und zu wissen, welche es gibt. Es kann sein, dass Sie auf ein Problem stoßen, das mit einem der verfügbaren Instrumente perfekt gelöst werden kann.

Kann ich Instrumente im Simulator verwenden?

Obwohl die meisten Instrumente im Simulator ausgeführt werden können, ist es nicht immer empfehlenswert, dies zu tun. Ein physisches Gerät zeigt realistischere Ergebnisse und wird daher empfohlen.

Verwenden Sie das Zeitprofil der Xcode-Instrumente, um die Leistung zu untersuchen und zu verbessern

Das Instrument Time Profiler gibt Einblicke in die CPUs des Systems und wie effektiv mehrere Kerne und Threads genutzt werden. Je besser dieser Teil Ihrer App ist, desto besser ist die Leistung Ihrer App.

Im Beispiel der App-Leistung von Collect hatten wir das Ziel, den Fluss beim Hinzufügen von Inhalten zu unserer App zu beschleunigen. Der Time Profiler ist unser Ausgangspunkt, um herauszufinden, welcher Teil des Codes optimiert werden kann.

Erstellen einer neuen Aufnahme mit dem Time Profiler Instrument

Nach der Auswahl des Time Profiler Instruments können wir eine neue Aufnahme starten, indem wir auf die rote Schaltfläche oben links drücken oder ⌘ + R verwenden. Dadurch wird die App auf dem ausgewählten Gerät gestartet, woraufhin Sie Ihren Fluss beginnen können.

Nachdem Sie den Fluss, den Sie verbessern möchten, beendet haben, können Sie die Aufzeichnung beenden und in die Ergebnisse eintauchen. Zunächst wollen wir wissen, wie der Hauptthread verwendet wird. Die Benutzeroberfläche wird blockiert, wenn auf dem Haupt-Thread viel Arbeit stattfindet, was genau das Problem ist, das wir in unserer Collect-App haben.

Mit Filtern eine Übersicht über die Threads erstellen

Die Filterleiste kann verwendet werden, um die Übersicht einzugrenzen und einen besseren Einblick in die verwendeten Threads zu erhalten, indem die Registerkarte Threads ausgewählt wird. Ein Scrollen nach unten zeigt, dass unser Haupt-Thread stark genutzt wird, während die anderen Threads weniger ausgelastet sind:

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

Erkennen, welcher Teil des Codes optimiert werden kann

Mit ⌘ + D wird der Detailbereich geöffnet, falls er noch nicht sichtbar ist. Hier werden die Symbolnamen für den markierten Zeitraum angezeigt. Im vorherigen Beispiel sehen Sie, dass die Spitzen im Diagramm blau hervorgehoben sind. Sie können dasselbe tun, indem Sie auf den Teil klicken und ziehen, den Sie untersuchen möchten.

Auf den ersten Blick sieht es ziemlich unbrauchbar aus, wenn man sich die Symbolnamen im Detailbereich ansieht:

Unclear symbol names in the detail area
Unscharfe Symbolnamen im Detailbereich

Obwohl die rechte Seite des Detailbereichs uns die schwerste Stack-Spur zeigt, können wir den Call Tree-Eingabefilter verwenden, um einen noch besseren Überblick zu bekommen.

Hide system libraries in the detail area
Systembibliotheken im Detailbereich ausblenden

Wir beginnen mit Systembibliotheken ausblenden, was alle Symbole der unteren Ebene entfernt, die nicht in unserer Kontrolle sind und von uns so oder so nicht optimiert werden können. Wie Sie sehen können, ist die Übersicht über die schwersten Stack Traces jetzt schon viel sauberer.

Als nächstes wird der Filter Invert Call Tree die Methoden der obersten Ebene sichtbar machen, ohne dass Sie sich durch jeden Call Tree klicken müssen. In Kombination mit der Sortierung nach der Gewichtsspalte können wir genau sehen, welche Methoden optimiert werden sollten.

Time Profile input filters to narrow down the results
Zeitprofileingabefilter, um die Ergebnisse einzugrenzen

Es ist ziemlich klar, dass unser PHImageManager Code am schlechtesten abschneidet, da er 3,36 Sekunden von den insgesamt 11,16 Sekunden benötigt. Es hat sich herausgestellt, dass wir dies ganz einfach in einen Hintergrund-Thread verlagern und den Haupt-Thread für diesen Teil entlasten können.

Eine andere Sache, die uns aufgefallen ist, ist BucketHeaderView, die ihre Höhe ständig neu berechnet, obwohl wir in dem Fluss, den wir testen, nichts damit gemacht haben. Es stellte sich heraus, dass wir dies tatsächlich nicht tun mussten.

Validieren der Ergebnisse

Nachdem Sie Ihren Code verbessert haben, ist es an der Zeit, den Time Profiler erneut auszuführen und die Ergebnisse zu validieren, um sicherzustellen, dass er tatsächlich verbessert wurde.

Validating results in the time profiler
Validierung der Ergebnisse im Time Profiler

Obwohl wir die Verbesserungen bereits in dem zuvor gezeigten Vorher-Nachher-Video gesehen haben, können wir nun auch sehen, dass derselbe Ablauf nicht mehr die PHImageManager als schwerste Stapelverfolgung enthält. Dies bestätigt, dass unsere Code-Änderung funktioniert hat.

Der Header wird auch nicht mehr neu berechnet und die Leistung unseres Flusses wurde verbessert.

ViRE – Visual Regular Expressions (Mac & iPad)ViRE ist ein Tool für visuelle reguläre Ausdrücke: Lesbare Regex – Code Complete / Cheat Sheet – Unit Tests – Leistungsstarkes Ersetzungssystem – Schritt-für-Schritt Suche & Ersetzen – Regex Visual Scheme – Regex History / Playground. ViRE ist auf Mac & iPad verfügbar.

Fazit

Xcode Instruments enthält viele wertvolle Tools, um die Performance der App zu verbessern. Der Time Profiler kann verwendet werden, um in einen bestimmten Ablauf einzutauchen, ein Stück Code zu verbessern und direkt danach zu validieren.

Nehmen Sie sich etwas Zeit, um in die verfügbaren Instrumente einzutauchen, damit Sie wissen, welche wann nützlich sind und beginnen, Ihre App zu verbessern. Wenn Sie noch mehr verbessern wollen, sollten Sie auch meinen Blogbeitrag über die Verbesserung der Build-Performance lesen!