In der heutigen hypervernetzten Welt wollen die Menschen schnell Ergebnisse. Als mobile Entwickler sind wir uns dessen besser bewusst als die meisten anderen. Unsere Benutzer setzen sich nicht vor einen Schreibtisch. Sie sind unterwegs und führen unsere Apps aus, während sie versuchen, zu gehen, zu sprechen und zu fahren. Daher erwarten sie bissige Erlebnisse. Steig ein, geh raus.
Mehrere Studien von Akamai, Google und anderen haben die Geschwindigkeit der Website mit der Benutzerbindung verknüpft. Bisher gibt es Hinweise darauf, dass Menschen mindestens genauso anspruchsvoll sind, wenn sie native Apps verwenden. In einer von Apigee durchgeführten Umfrage unter mobilen Benutzern ist die Hauptbeschwerde bei mobilen Anwendungen das Einfrieren, und über 44% der befragten Benutzer gaben an, dass sie eine langsam funktionierende App sofort löschen würden.
Fragen Sie Facebook nach der Bedeutung von schnellen mobilen Apps. Mark Zuckerberg sagte, dass ihre Aktien auf HTML5 basierten, der größte Fehler, den sie als Unternehmen begangen hatten, als ihre Aktien den Tiefpunkt bei den Teenagerinnen erreichten. Warum? Weil es langsam war. Innerhalb von drei Wochen nach Veröffentlichung der neuen, schnelleren nativen App von Facebook war die Bewertung der Anwendung von 1,5 Sternen auf 4 gestiegen. Langsame Anwendungen verursachen erhebliche geschäftliche Probleme. Verlorene Benutzer Dollar verloren.
Beim ersten Gespräch mit Entwicklern über die Überwachung der Leistung ihrer App in der Produktion war die häufigste Antwort: "Meine App ist bereits schnell".
Das Problem ist, dass es angesichts der Welt der mobilen Fragmente schwierig ist, eine konstant schnelle Erfahrung zu liefern. Wie funktioniert Ihre App in China auf einem alten Telefon und in einem langsamen Netzwerk? Ich bin bereit zu wetten, dass Sie keine Ahnung haben. Es ist sicherlich nicht das gleiche wie auf Ihrem brandneuen iPhone, das mit Ihrem Wi-Fi verbunden ist.
Die Leistung hängt vollständig vom Kontext ab, in dem Ihre Anwendung ausgeführt wird. Hier ist eine kurze, aber sicherlich nicht vollständige Liste von Leistungs-Gotchas:
Wir sind es gewohnt, Internet-Probleme in Bezug auf die Bandbreitenbeschränkungen zu betrachten, aber in zellularen Netzwerken ist Latenz oft der dominierende Faktor. In einem 3G-Netzwerk kann es etwa 2,5 Sekunden dauern, bis ein einzelnes Byte übertragen wird, um vom Leerlauf zur Verbindung zu wechseln. Laut Sprint beträgt die durchschnittliche Latenzzeit im 3G-Netzwerk 400 ms. Es spielt keine Rolle, wie schnell Ihr Server eine Anfrage verarbeitet, wenn die Antwort langsam zum Telefon kommt.
Als Geeks entwickeln wir oft das Neueste und Beste, aber der Großteil der Welt, einschließlich massiver Märkte, die Sie gerne durchdringen möchten, gibt das Tempo auf, um erschwinglich zu sein. Unsere Tests zeigen, dass CPU-gebundener Code auf einem iPod 4G etwa viermal länger dauert als auf einem iPhone 5S. Bei Android ist der Unterschied noch größer.
Wenn Ihre App zu viel Speicher verwendet, wird sie vom Betriebssystem abgebrochen. Für den Benutzer sieht dies wie eine Nullzeigerausnahme aus. Selbst wenn Ihr Code ohne einen einzigen Speicherverlust sauber ist, kann die hohe Speichergrenze Ihres Speichers zu Abstürzen bei weniger leistungsstarken, aber beliebten Telefonen in wichtigen Märkten führen.
Batterien sind eines der ersten Dinge, bei denen die Hersteller verkleinert werden, wenn die Hersteller versuchen, Platz und Geld zu sparen. Dies führt jedoch nicht zu einem besseren Verständnis der Benutzer, wenn Ihre App ihre gesamte Leistung verbraucht.
Nehmen wir einmal an, Sie sind davon überzeugt, dass Sie eine schnelle Anwendung benötigen, und es sollte überall schnell sein, nicht nur für Sie, wenn Sie Ihre App über Apples Instruments CPU Profiler ausführen. Was soll ein Entwickler tun? Im Moment haben Sie zwei grundlegende Optionen:
Eine schnelle API bedeutet eine schnelle App. Recht? Dies ist die Mentalität eines Webentwicklers, und wenn Sie ein mobiler Entwickler sind, ist es falsch.
Das Web ist eine Thin Client-Architektur. Abgesehen von JavaScript-starken Web-Apps wird der größte Teil des interessanten Codes hinter Websites auf dem Server ausgeführt. Der Client - der Browser - ist eigentlich nur eine zustandslose Rendering-Engine. Wenn die Leistung nachlässt, ist dies normalerweise ein Skalierungsproblem in Ihrer Backend-Infrastruktur.
Native, mobile Apps hingegen sind starke Kunden. Sie verfügen über große Codebasen mit mehreren Threads. Sie behalten den Staat bei. Und sie müssen auf einer Vielzahl von Mobilteilen, Betriebssystemen und Netzwerken eingesetzt werden. Ihr Serverteam kann immer noch die Benutzererfahrung vermasseln, aber es gibt eine ganze Reihe neuer Probleme, die in Ihren Server-Alarmen nicht angezeigt werden.
Fein. Du verstehst es. Sie müssen sicherstellen, dass Sie Ihre Apps in einer Reihe testen echte Welt Szenarien. Sie bauen also ein schickes QA-Labor mit 100 verschiedenen Mobilteilen. Dann schließen Sie sie in einen Faraday-Käfig ein, um widrige Netzwerkbedingungen zu simulieren und eine Armee von QS-Mitarbeitern einzustellen, die jede neue Version durch alle möglichen Aktionen in Ihrer Anwendung laufen lässt.
Ich gebe zu, wenn Sie es sich leisten können, ist das keine schlechte Idee. Die Kombinationen werden jedoch schnell überwältigend. Stellen Sie sich vor, Sie interessieren sich für die Top 100-Telefone, 10 Netzwerkgeschwindigkeiten, 20 verschiedene ausländische Märkte mit unterschiedlichen Latenzen und 5 verschiedene Betriebssystemversionen. Stellen Sie sich jetzt vor, Sie haben 50 verschiedene Aktionen in Ihrer App. Wenn Sie die gegenseitige Abhängigkeit zwischen den Aktionen und den unterschiedlichen Benutzerdaten ignorieren, müssen Sie 1 Million Kombinationen testen. Autsch!
Dies ist ein klassisches QA-Problem. Qualitätssicherung bedeutet, Ihr Bestes zu geben, um die häufigsten Anwendungsfälle zu testen. Es ist jedoch nie als Ersatz für das Monitoring gedacht. Es ist einfach unmöglich, den Überblick über alle möglichen Fehlerfälle zu behalten.
Wir benötigen ein neues Toolset, das von Grund auf aufgebaut wurde, um die Leistungsprobleme mobiler Apps gezielt zu messen. Welche Metriken sollten diese neuen Tools erfassen??
Nichts ärgert einen Benutzer mehr als ein eingefrorener Bildschirm. Wenn Sie jedes Mal erfassen, wenn Ihre App einen Zeitrahmen überschreitet, um einen Frame zu rendern, können Sie sich ein Bild davon machen, wie oft sie einen spürbaren Stand feststellt.
Wenn Sie die guten UI / UX-Praktiken befolgen, sollten Sie immer dann, wenn Sie Arbeiten ausführen müssen, die mehr als ein paar Millisekunden dauern, dies im Hintergrund tun und einen Spinner einsetzen müssen. Aber selbst wenn Sie sich auf Ihrem Threading befinden, haben die Benutzer nur wenig Geduld.
Nach 1 Sekunde haben Benutzer einen mentalen Kontextwechsel, und nach 10 Sekunden geben Benutzer ihre Aufgabe ab. Wenn Sie jedes Mal erfassen, wenn Sie einen Spinner anzeigen, haben Sie einen guten generischen Indikator dafür, wie lange der typische Benutzer auf Ihre App wartet.
Speicherfehler sind eines der am schwersten aufzuspürenden Dinge, besonders seit dem Kein Speicher mehr Killer unter iOS führt nicht zu einer Stapelverfolgung. Es ist zu teuer, um jede Zuordnung zu verfolgen, aber die Aufzeichnung des residenten Speichers unter iOS oder VM Heap unter Android ist ein guter Overhead-Wert.
Latenz und Bandbreite sind in zellularen Netzwerken sehr unterschiedlich und spielen eine entscheidende Rolle für die Benutzererfahrung. Sie können für jede API-Anforderung aufzeichnen, wie lange es dauert, um die erste Antwort (Latenz) zu erhalten, wie lange es dauert, um die vollständige Antwort (Downloadzeit) zu erhalten, und wie viele Bytes (Byte / Downloadzeit entspricht Bandbreite)..
Einer der wenigen Gründe, warum ich Apps deinstalliere, ist der hohe Akkuverbrauch. Es ist offensichtlich, dass die Batterie scheiße ist, wie beispielsweise das GPS des Geräts, aber es gibt auch andere unerwartete Probleme, beispielsweise die drahtlose Antenne zu oft zu aktivieren. Sowohl iOS als auch Android bieten APIs zur Überwachung des Akkuladezustands.
Im mobilen Kontext ist alles alles. Wenn etwas schief geht, sollten Sie mindestens die Anwendungsversion, den Standort, das Netz der Carrier, die Version des Betriebssystems und das Gerät kennen.
Wenn Sie ehrgeizig sind, verfügen Sie in Ihrer Anwendung möglicherweise über hausinterne Leistungsinstrumente. Sie haben wahrscheinlich einige grundlegende Timer für die wichtigsten Aktionen in Ihrer App. Rufen Sie die Daten dann entweder über ein Protokoll oder ein spezielles JSON-Paket an.
Wenn ja, klopfe dir auf den Rücken. Sie haben weit mehr getan als die meisten. Dieser Ansatz hat jedoch viele Nachteile. Was ist, wenn Sie an unerwarteten Stellen in Ihrer App Leistungsprobleme haben? Wenn Sie ein Problem haben, woher wissen Sie, woran es liegt? War es ein langer Methodenaufruf, eine langsame API-Anforderung oder zu viele Daten auf der Leitung?
Und wenn Sie die Rohdaten erhalten, wie analysieren und visualisieren Sie sie? Wenn Sie ein einmaliges Skript schreiben, wie oft führen Sie es aus? Und, Gott bitte, was passiert, wenn Ihre Leistungsinstrumente zu Leistungsproblemen führen?
Bei Pulse.io haben wir im vergangenen Jahr hart gearbeitet, um ein SDK zu bauen, das voll von Überwachungsqualität ist. Wir erfassen alle oben aufgeführten Messgrößen und behalten dabei einen sehr geringen Footprint bei. Wir verbrauchen weniger als 3% der CPU, senden die Daten per Stapelverarbeitung, um zu vermeiden, dass das Radio eingeschaltet wird, und die Speicherbelegung wird begrenzt, indem Informationen mit niedriger Priorität verworfen werden.
Das Beste an Pulse.io ist, dass es all das automatisch erfasst. Es ist eine Sache, Ihre App manuell mit Ihrer selbst entwickelten Lösung zu instrumentieren. Es ist eine andere Sache, jeden Ingenieur in Ihrem Team davon zu überzeugen und die gleiche Instrumentierungsmethode im Laufe der Zeit konsequent anzuwenden.
Mit Pulse.io legen Sie einfach das SDK ab, und es findet automatisch alle Benutzerinteraktionen in Ihrer App und zeichnet auf, wenn diese Interaktionen zu schlechtem Verhalten führen, z. B. Einfrieren des Bildschirms oder lange asynchrone Aufgaben.
Die Installation von Pulse.io erfordert weniger Zeit als das Lesen dieses Artikels. Wir befinden uns derzeit in einer privaten Betaversion, aber wenn Sie uns eine E-Mail an beta [at] pulse [dot] io senden und erwähnen, dass Sie auf Tuts + über uns gelesen haben, richten wir Ihnen ein Konto ein.
Nachdem Sie das SDK heruntergeladen haben, ist die Installation sehr einfach. Legen Sie das SDK in Ihrer App ab, fügen Sie einige Abhängigkeiten hinzu und rufen Sie es an [PulseSDK-Monitor: @ "YOUR_APP_KEY"]
innerhalb Ihrer App main.m
. Sie sind fertig.
Hoffentlich habe ich dich von drei Dingen überzeugt:
Ich möchte Sie dazu ermutigen, die tatsächliche Leistung Ihrer eigenen App zu untersuchen. Gib Pulse.io einen Versuch. Es gibt nicht viel zu verlieren und eine Menge Leistung zu gewinnen.