In de hyperverbonden wereld van vandaag willen mensen snel resultaten. Als mobiele ontwikkelaars zijn we ons hier meer van bewust dan de meesten. Onze gebruikers gaan niet voor een bureau zitten. Ze zijn onderweg, gebruiken onze apps terwijl ze proberen te lopen, praten en rijden, dus ze verwachten pittige ervaringen. Stap in, ga weg.
Meerdere onderzoeken van Akamai, Google en anderen hebben de website-snelheid gecorreleerd met de gebruikersretentie. En tot nu toe suggereren gegevens dat mensen minstens zo veeleisend zijn als ze native apps gebruiken. In een onderzoek van mobiele gebruikers door Apigee is de grootste klacht over mobiele applicaties bevroren en meer dan 44% van de ondervraagde gebruikers zei dat ze een langzaam presterende app onmiddellijk zouden verwijderen.
Vraag Facebook naar het belang van snelle mobiele apps. Toen hun aandelen in de high-teens uitbodemden, zei Mark Zuckerberg dat het baseren van hun app op HTML5 de grootste fout was die ze als bedrijf maakten. Waarom? Omdat het traag was. Binnen drie weken na de release van de nieuwe, snellere native app van Facebook, was de rating van de app van 1,5 naar 4 gestegen. Langzame applicaties veroorzaken veel bedrijfsklachten. Verloren gebruikers. Verloren dollars.
Toen ik voor het eerst met ontwikkelaars praatte over het controleren van de prestaties van hun app in de productie, was de meest voorkomende reactie 'Mijn app is al snel'.
Het probleem is dat het, net als de wereld van mobiele fragmenten, moeilijk is om een consistent snelle ervaring te leveren. Hoe presteert uw app in China op een oude telefoon en een traag netwerk? Ik durf te wedden dat je geen idee hebt. Het is zeker niet hetzelfde als het presteert op je gloednieuwe iPhone die is verbonden met je kantoor Wi-Fi.
Prestaties zijn volledig afhankelijk van de context waarin uw toepassing wordt uitgevoerd. Hier is een snelle maar zeker niet complete lijst met prestatie-gotchas:
We zijn gewend om te denken aan internetproblemen in termen van bandbreedtebeperkingen, maar in cellulaire netwerken is latency vaak de dominante factor. Op een 3G-netwerk kan het ongeveer 2,5 seconden duren om van stationair naar verbonden te gaan voordat een enkele byte wordt verzonden. En Sprint zegt dat de gemiddelde latentie op hun 3G-netwerk 400ms is. Het maakt niet uit hoe snel uw server een verzoek verwerkt als het antwoord langzamerhand naar de telefoon gaat.
Als geeks ontwikkelen we vaak het nieuwste en het grootste, maar het grootste deel van de wereld, inclusief enorme markten waar je graag zou willen binnendringen, geven snelheid op om betaalbaarheid te bereiken. Uit onze tests blijkt dat CPU-gebonden code op een iPod 4G ongeveer vier keer langer duurt dan op een iPhone 5S. Op Android is de ongelijkheid nog groter.
Als uw app te veel geheugen gebruikt, wordt deze door het besturingssysteem gedood. Voor de gebruiker ziet dit er hetzelfde uit als een uitzondering voor een lege aanwijzer. Zelfs als uw code kraakhelder is zonder een enkel geheugenlek, kan uw hoge geheugenrecord leiden tot crashes op minder krachtige maar populaire telefoons in belangrijke markten.
Batterijen zijn een van de eerste dingen om te verkleinen wanneer fabrikanten ruimte en geld willen besparen. Maar dat betekent niet dat gebruikers meer begrip zullen hebben wanneer je app al hun macht afneemt.
Laten we zeggen dat u er even van overtuigd bent dat u een snelle applicatie nodig hebt en dat deze overal snel moet zijn, niet alleen voor u wanneer u uw app uitvoert via de CPU-profileermachine van Apple. Wat moet een ontwikkelaar doen? Op dit moment heb je twee basisopties:
Een snelle API betekent een snelle app. Rechts? Dit is de mentaliteit van een webontwikkelaar en als je een mobiele ontwikkelaar bent, is het verkeerd.
Het web is een thin client-architectuur. De JavaScript zware web-apps terzijde schuiven, de meeste interessante code achter websites draait op de server. De client, de browser, is in feite gewoon een stateloze rendering-engine. Wanneer de prestaties afnemen, is dit meestal een schaalprobleem in uw back-endinfrastructuur.
Native, mobiele apps zijn dikke klanten. Ze hebben grote, multi-threaded codebases. Ze handhaven de staat. En ze moeten optreden op een grote verscheidenheid aan handsets, besturingssystemen en netwerken. Uw serverteam kan de ervaring van de gebruiker nog steeds verknoeien, maar er is een hele nieuwe reeks problemen die niet zullen verschijnen in uw serverwaarschuwingen.
Fijn. Je snapt het. U moet ervoor zorgen dat u uw apps test in een aantal echte wereld scenario's. Dus je gaat een chique QA-lab bouwen met 100 verschillende handsets. Dan ga je ze in een kooi van Faraday omsluiten, zodat je ongunstige netwerkomstandigheden kunt simuleren, en een leger QA-mensen kunt huren om elke nieuwe release door elke mogelijke actie in je applicatie te laten gaan..
Ik geef toe, als je het kunt betalen, is dit geen slecht idee. Maar de combinaties worden al snel overweldigend. Stel je voor dat je geeft om de top 100 telefoons, 10 netwerksnelheden, 20 verschillende buitenlandse markten met verschillende latencies en 5 verschillende OS-versies. Stel je nu voor dat je 50 verschillende acties in je app hebt. Als u de onderlinge afhankelijkheid tussen de acties en de verschillende gebruikersgegevens negeert, moet u 1 miljoen combinaties testen. au!
Dit is een klassiek QA-probleem. Kwaliteitsborging betekent dat u uw best doet om de meest voorkomende use-cases te testen. Maar het is nooit bedoeld als vervanging voor monitoring. Het is gewoon onmogelijk om op de hoogte te blijven van alle mogelijke faalgevallen.
We hebben een nieuwe toolset nodig, van de grond af opgebouwd om specifiek de prestatieproblemen van mobiele apps te meten. Welke statistieken moeten deze nieuwe tools vastleggen?
Niets irriteert een gebruiker meer dan een bevroren scherm. Door elke keer dat uw app een tijdsdrempel heeft bereikt vast te leggen om een frame weer te geven, kunt u een idee krijgen van hoe vaak zij een merkbare bevriezing zien.
Als u goede UI / UX-procedures volgt, moet u op elk gewenst moment werk doen dat meer dan een paar milliseconden duurt, op de achtergrond en met een draaiknop. Maar zelfs als u aan uw threading denkt, hebben gebruikers nog steeds een beperkt geduld.
Na 1 seconde hebben gebruikers een schakelaar voor mentale context en na 10 seconden verlaten gebruikers hun taak. Als u elke keer dat u een spinner laat zien vastlegt, heeft u een goede generieke indicator van hoe lang de gemiddelde gebruiker op uw app wacht.
Geheugen bugs zijn een van de moeilijkste dingen om op te sporen, vooral sinds de Geheugen vol moordenaar op iOS resulteert niet in een stacktracering. Het is te duur om elke toewijzing bij te houden, maar het vastleggen van het interne geheugen op iOS of VM. Heapgebruik op Android zijn goede, lage overheadmetingen.
Latentie en bandbreedte zijn beide zeer variabel op cellulaire netwerken en spelen een sleutelrol in de gebruikerservaring. Voor elke API-aanvraag kunt u vastleggen hoe lang het duurt om de eerste respons (latency) te krijgen, hoe lang het duurt om het volledige antwoord te krijgen (downloadtijd) en bytes gedownload (bytes / downloadtijd is gelijk aan bandbreedte).
Een van de weinige redenen waarom ik apps deïnstalleer, is het hoge batterijgebruik. Er is een overduidelijke batterij leeg, zoals het gebruik van de GPS van het apparaat, maar er zijn andere onverwachte valstrikken, zoals het te vaak activeren van de draadloze antenne. Zowel iOS als Android bieden API's voor het controleren van de acculadingniveaus.
In mobiel is context alles. Als er iets misgaat, moet u ten minste de toepassingsversie, de locatie, het netwerk van de provider, de versie van het besturingssysteem en het apparaat kennen.
Als u ambitieus bent, heeft u misschien een aantal eigen prestatiesystemen in uw toepassing. U hebt waarschijnlijk enkele basistimers voor belangrijke acties in uw app en neemt vervolgens de gegevens thuis op via een logboek of een speciaal pakket van JSON.
Als dat zo is, gebruik dan een schouderklopje. Je hebt veel meer gedaan dan de meesten. Maar er zijn veel nadelen aan deze aanpak. Wat als je prestatieproblemen hebt op onverwachte plaatsen in je app? Als je een probleem hebt, hoe weet je dan waardoor het is veroorzaakt? Was het een lange methode aanroep, een traag API-verzoek of te veel gegevens op de draad?
En als u eenmaal de onbewerkte prestatiegegevens hebt ontvangen, hoe analyseert en visualiseert u deze dan? Als u een eenmalig script schrijft, hoe vaak voert u het uit? En, God verhoede, wat gebeurt er als je uitvoeringsinstrumenten prestatieproblemen veroorzaken?
Bij Pulse.io hebben we het afgelopen jaar hard gewerkt aan het bouwen van een SDK boordevol goedheid. We leggen alle hierboven vermelde statistieken vast met behoud van een zeer lichte voetafdruk. We verbruiken minder dan 3% van de CPU, sturen batches onze gegevens om te voorkomen dat de radio wordt ingeschakeld en beperken ons geheugengebruik door informatie met lage prioriteit te verwijderen.
Het leukste aan Pulse.io is dat het al dit spul automatisch registreert. Het is één ding om uw app handmatig te bewerken met uw eigen ontwikkelde oplossing. Het is iets heel anders om elke ingenieur in je team ervan te overtuigen dit te doen en dezelfde instrumentatiemethode consequent toe te passen in de loop van de tijd.
Met Pulse.io hoeft u alleen de SDK in te voeren en worden automatisch alle gebruikersinteracties in uw app en records gevonden wanneer die interacties slecht gedrag veroorzaken, zoals het bevriezen van het scherm of lange asynchrone taken.
Het installeren van Pulse.io kost minder tijd dan het lezen van dit artikel. We bevinden ons momenteel in de privé-bèta, maar als je ons een e-mail op bèta [at] pulse [punt] io en ons op Tuts + leest, zullen we je instellen met een account.
Nadat u de SDK hebt gedownload, is de installatie supereenvoudig. Zet de SDK in uw app, voeg een paar afhankelijkheden toe en bel [PulseSDK-monitor: @ "YOUR_APP_KEY"]
in uw app's main.m
. U bent klaar.
Hopelijk heb ik je van drie dingen overtuigd:
Ik raad u aan de werkelijke wereldprestaties van uw eigen app te onderzoeken. Geef Pulse.io een kans. Er valt niet veel te verliezen en een heleboel prestaties te winnen.