I dagens hyperlänkade värld vill människor snabbt få resultat. Som mobilutvecklare är vi mer medvetna om detta än de flesta. Våra användare sätter sig inte ner framför ett skrivbord. De är på språng, kör våra appar medan de försöker gå, prata och köra, så de förväntar sig snabba upplevelser. Kom in, kom ut.
Flera studier från Akamai, Google och andra har korrelerat webbplatshastighet med användarretention. Och hittills tyder bevis på att människor är minst lika krävande när de använder inhemska appar. I en undersökning av mobilanvändare som görs av Apigee fryser klagomålet om mobila applikationer, och över 44% av de undersökta användarna sa att de skulle radera en sakta utföra app omedelbart.
Fråga Facebook om vikten av snabba mobilappar. När deras lager botten i höga tonåren, sade Mark Zuckerberg att basera deras app på HTML5 var det största misstaget de gjorde som ett företag. Varför? Eftersom det var långsamt. Inom tre veckor efter utgivandet av Facebook: s nya, snabbare inhemska app, hade programmets betyg klättrat från 1,5 stjärnor till 4. Långsamma applikationer orsakar betydande affärsmärtor. Förlorade användare. Förlorade dollar.
När du först pratar med utvecklare om att övervaka programmets prestanda i produktion, var det vanligaste svaret "Min app är redan snabb."
Problemet är, som en värld av mobila fragment, det är svårt att leverera en konsekvent snabb upplevelse. Hur fungerar din app i Kina på en gammal telefon och ett långsamt nätverk? Jag är villig att satsa du har ingen aning. Det är verkligen inte detsamma som det utför på din helt nya iPhone ansluten till ditt Wi-Fi-kontor.
Prestanda är helt beroende av det sammanhang där din ansökan körs. Här är en snabb men absolut inte komplett lista över prestanda gotchas:
Vi är vana vid att tänka på internetproblem när det gäller begränsningar av bandbredd, men i mobiltelefonnät är latens ofta den dominerande faktorn. På ett 3G-nätverk kan det ta cirka 2,5 sekunder att gå från tomgång till ansluten innan en enda byte överförs. Och Sprint säger att den genomsnittliga latensen på deras 3G-nätverk är 400ms. Det spelar ingen roll hur snabbt din server behandlar en förfrågan om svaret går långsamt till telefonen.
Som nördar utvecklar vi ofta med det senaste och det bästa, men det mesta av världen, inklusive massiva marknader du vill tränga igenom, ge upp fart för att uppnå överkomliga priser. Våra test visar att CPU-bunden kod på en iPod 4G tar ungefär fyra gånger längre än på en iPhone 5S. På Android är skillnaden ännu viktigare.
Om din app använder för mycket minne, dödas det av operativsystemet. Till användaren ser detta ut som ett undantag för nollpekare. Även om din kod är rena utan ett enda minnesläckage kan ditt minnesvattenmärke leda till kraschar på mindre kraftfulla men populära telefoner på viktiga marknader.
Batterier är en av de första sakerna att minska när tillverkare försöker spara utrymme och pengar. Men det kommer inte att göra användarna mer förstående när din app tömmer all sin makt.
Låt oss säga ett ögonblick är du övertygad om att du behöver en snabb applikation, och den ska vara snabb överallt, inte bara för dig när du kör din app via Apples Instruments CPU-profiler. Vad är en utvecklare att göra? Just nu har du två grundläggande alternativ:
Ett snabbt API betyder en snabb app. Höger? Det här är en webbutvecklarens mentalitet, och om du är en mobilutvecklare är det fel.
Webben är en tunn klientarkitektur. Inställning av JavaScript-tunga webapps, det mesta av den intressanta koden bakom webbplatser körs på servern. Klienten-webbläsaren-är i själva verket bara en statslös renningsmotor. När prestanda minskar är det vanligtvis ett skaleringsproblem i din backend-infrastruktur.
Native, mobilappar, å andra sidan, är tjocka kunder. De har stora, multi-threaded kod baser. De upprätthåller staten. Och de måste utföra på ett stort antal telefoner, operativsystem och nätverk. Ditt servern team kan fortfarande skruva upp användarens upplevelse, men det finns en helt ny uppsättning problem som inte kommer att dyka upp i dina serverns varningar.
Bra. Du förstår. Du måste se till att du testa dina appar i en massa verkliga världen scenarier. Så du kommer att bygga ett fint QA-labb med 100 olika telefoner. Då kommer du att bifoga dem i en faradaybur så att du kan simulera negativa nätverksförhållanden och anställa en armé av QA-folk för att köra varje ny release genom alla möjliga åtgärder i din ansökan.
Jag ska erkänna, om du har råd med det, är det inte en dålig idé. Men kombinationerna blir snabbt överväldigande. Tänk dig att du bryr dig om de 100 bästa telefonerna, 10 nätverkshastigheter, 20 olika utländska marknader med olika latenser och 5 olika OS versioner. Tänk nu att du har 50 olika åtgärder i din app. Ignorera ömsesidigt beroende mellan åtgärderna och varierande användardata, har du 1 miljon kombinationer som ska testas. Aj!
Detta är ett klassiskt QA-problem. Kvalitetssäkring betyder att du gör ditt bästa för att testa de vanligaste användningsfallen. Men det är aldrig meningen att vara en ersättare för övervakning. Det är helt enkelt omöjligt att hålla sig på alla möjliga misslyckanden.
Vi behöver en ny verktygssats, byggd från grunden för att specifikt mäta prestandafrågor i mobilappar. Vilka mätvärden ska dessa nya verktyg fånga?
Inget irriterar en användare mer än en frusen skärm. Genom att fånga varje gång din app tar över en tidsgräns för att göra en ram kan du få en uppfattning om hur ofta de ser en märkbar frysning.
Om du följer bra UI / UX-rutiner, när du behöver göra arbete som tar mer än några millisekunder ska du göra det i bakgrunden och kasta upp en spinnare. Men även om du befinner dig på toppen av din tråda, har användarna fortfarande begränsat tålamod.
Efter 1 sekund har användarna en mental kontextomkopplare och efter 10 sekunder överger användarna sin uppgift. Om du fångar varje gång du visar en spinnare, har du en bra generisk indikator på hur länge den typiska användaren väntar på din app.
Minnesbuggar är en av de svåraste sakerna att spåra, särskilt sedan Slut på minne mördare på iOS resulterar inte i ett spårspår. Det är för dyrt att spåra varje tilldelning, men det är bra att spela in minnesminne på iOS eller VM Heap-användningen på Android, låga mätvärden.
Latency och bandbredd är båda mycket varierbara på mobilnät och spelar en nyckelroll i användarupplevelsen. För varje API-förfrågan kan du spela in hur lång tid det tar att få det ursprungliga svaret (latens), hur lång tid det tar att få fullt svar (nedladdningstid) och byte nedladdade (bytes / nedladdningstid är lika med bandbredd).
En av de få anledningarna till att jag avinstallerar appar är användning av hög batterier. Det är uppenbart batteri suger, som att använda enhetens GPS, men det finns andra oväntade gotchas, som att aktivera den trådlösa antennen för ofta. Både iOS och Android erbjuder API för övervakning av laddningsnivåerna för batterier.
I mobil är sammanhang allt. När något går fel bör du åtminstone veta applikationsversion, plats, bärarnätverk, version av operativsystemet och enheten.
Om du är ambitiös kan du ha en del homegrown performance instrumentation i din ansökan. Du har förmodligen några grundläggande timers för nyckelåtgärder i din app, sedan telefon hem data via antingen en logg eller ett specialiserat paket med JSON.
Om så är fallet, klistra dig själv på baksidan. Du har gjort mycket mer än de flesta. Men det finns många nackdelar med detta tillvägagångssätt. Vad händer om du har prestandaproblem på oväntade platser i din app? Om du har problem, hur vet du vad som orsakade det? Var det ett långt metodsamtal, en långsam API-begäran eller för mycket data på ledningen?
Och när du får data om råprestanda, hur analyserar du och visualiserar den? Om du skriver ett engångsskript, hur ofta kör du det? Och, förbjud gud, vad händer om din prestanda instrumentation orsakar prestanda problem?
På Pulse.io har vi varit svåra på jobbet under det senaste året och byggde en SDK-full av övervakning av godhet. Vi fångar alla de ovan angivna värdena medan du håller ett mycket ljust fotavtryck. Vi förbrukar mindre än 3% av CPU, batch skickar våra data för att undvika att sätta på radion och begränsa vår minnesanvändning genom att kassera lågprioritetsinformation.
Den bästa delen om Pulse.io är att det fångar alla dessa saker automagiskt. Det är en sak att manuellt styra din app med din hemodlade lösning. Det är en sak att helt och hållet övertyga varje ingenjör på ditt lag för att göra det och att tillämpa samma instrumentationsmetod konsekvent över tiden.
Med Pulse.io slipper du bara i SDK och det hittar automatiskt alla användarinteraktioner i din app och poster när dessa interaktioner orsakar dåligt beteende som skärm fryser eller långa asynkrona uppgifter.
Installera Pulse.io tar dig mindre tid än att läsa den här artikeln. Vi är för närvarande i privat beta, men om du skjuter oss ett e-postmeddelande på beta [at] puls [dot] io och nämner att du läser om oss på Tuts +, ställer vi dig in med ett konto.
När du har laddat ner SDK-enheten är installationen super enkel. Släpp SDK i din app, lägg till några beroenden och ring [PulseSDK-bildskärm: @ "YOUR_APP_KEY"]
i din app main.m
. Du är klar.
Förhoppningsvis har jag övertygat dig om tre saker:
Jag uppmuntrar dig att undersöka din egen apps verkliga prestanda. Ge Pulse.io ett försök. Det finns inte mycket att förlora och mycket prestanda att vinna.