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:
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.
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:
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:
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.
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.
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.
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.
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!