Pianificare e misurare le prestazioni delle app

Gli utenti si aspettano che le app rimangano reattive, sentirsi naturali e non svuotare la batteria. Tecnicamente, le prestazioni sono un requisito non funzionale, ma la gestione delle prestazioni come funzionalità consente di raggiungere le aspettative degli utenti. Specificare gli obiettivi e misurare i risultati: questi sono fattori chiave. Determinare gli scenari critici per le prestazioni, definire quali buone prestazioni significa e quindi misurare in anticipo e spesso nel ciclo di vita del progetto per avere la certezza di raggiungere gli obiettivi.

Specificare gli obiettivi

L'esperienza utente è un modo di base per definire prestazioni ottimali. Il tempo di avvio di un'app può influenzare la percezione delle prestazioni di un utente. Un utente potrebbe considerare un tempo di avvio dell'app inferiore a un secondo per essere eccellente, meno di cinque secondi per essere buono e maggiore di cinque secondi per essere scarso.

Altre metriche hanno un impatto meno evidente sull'esperienza utente, ad esempio la memoria. Le probabilità che un'app venga terminata quando è sospesa o inattiva aumentano con l'aumentare della quantità di memoria utilizzata dall'app attiva. L'utilizzo elevato della memoria degrada l'esperienza per tutte le app nel sistema, quindi avere un obiettivo di consumo di memoria è ragionevole.

Impostare obiettivi iniziali specifici e misurabili. Devono rientrare in tre categorie:

  • Tempo : tempo necessario per gli utenti o l'app per completare le attività
  • Fluidità : velocità e continuità con cui l'app si ridisegna in risposta all'interazione dell'utente
  • Efficienza : quanto bene l'app consente di risparmiare risorse di sistema, inclusa l'alimentazione a batteria

Time

Si pensi a intervalli accettabili di tempo trascorso (classi di interazione) per consentire agli utenti di completare le attività.

Classe di interazione Percezione dell'utente Ideal Massimo Examples
Veloce Ritardo minimo evidente 100 ms 200 ms Visualizzare la barra dell'app; premere un pulsante (prima risposta)
Tipico Veloce, ma non veloce 300 ms 500 ms Ridimensiona; zoom semantico
Reattivo Non è veloce, ma sembra reattivo 500 ms 1 secondo Passare a una pagina diversa; riprendere l'app
Launch Esperienza competitiva 1 secondo 3 secondi Avviare l'app per la prima volta
Continuo Non si sente più reattivo 500 ms 5 secondi Scaricare un file da Internet
Prigioniero Troppo lungo; l'utente potrebbe passare ad altro 500 ms 10 secondi Installare più app dallo Store

Assegnare classi di interazione agli scenari di prestazioni dell'app. Per ogni scenario, assegnare il riferimento temporizzato dell'app, una parte dell'esperienza utente e una classe di interazione.

Fluidità

Obiettivi di fluidità misurabili specifici per l'app possono includere:

  • Nessuna interruzione o irregolarità nell'aggiornamento dello schermo (anomalie)
  • Le animazioni eseguono il rendering a 60 fotogrammi al secondo (FPS)
  • Quando un utente esegue la panoramica o lo scorrimento, l'app presenta 3-6 pagine di contenuto al secondo

Efficiency

Obiettivi di efficienza misurabili specifici per l'app possono includere:

  • La percentuale di CPU dell'app è uguale o inferiore a un valore target e l'utilizzo della memoria in MB è uguale o inferiore a un valore target in ogni momento
  • Quando l'app è inattiva, l'uso della CPU e della memoria è minimo
  • L'app può essere utilizzata attivamente per un numero prestabilito di ore con alimentazione a batteria

Progetta la tua app per garantire prestazioni elevate

Usa gli obiettivi di prestazioni per influenzare la progettazione della tua app. Considerare questi aspetti:

UI

  • Ottimizzare l'efficienza di analisi e caricamento e memoria per ogni pagina ottimizzando il markup XAML. Rinviare il caricamento dell'interfaccia utente e del codice fino a quando non è necessario.
  • Per ListView e GridView, rendere tutti gli elementi le stesse dimensioni e usare tutte le tecniche di ottimizzazione possibile.
  • Dichiarare l'interfaccia utente nel markup anziché crearla in modo imperativo nel codice.
  • Ritardare la creazione di elementi dell'interfaccia utente fino a quando l'utente non ne ha bisogno usando l'attributo x:Load .
  • Preferisce transizioni di tema e animazioni alle animazioni con storyboard. Le animazioni con storyboard richiedono aggiornamenti costanti sullo schermo e mantengono attiva la pipeline di CPU e grafica.
  • Caricare le immagini a una dimensione appropriata per la visualizzazione in cui sono presenti.

CPU, memoria e alimentazione

  • Pianificare il lavoro con priorità inferiore sui thread con priorità inferiore. Vedere Programmazione asincrona e classe DispatcherQueue .
  • Riduci al minimo l'utilizzo di memoria dell'app liberando le risorse onerose, ad esempio i contenuti multimediali, quando non sono necessarie.
  • Evitare perdite di memoria annullando la registrazione di gestori eventi e dereferenziando gli elementi dell'interfaccia utente quando possibile.
  • Per ottimizzare l'efficienza della batteria, limita la frequenza con cui esegui il polling dei dati, interroghi un sensore o pianifichi attività sulla CPU quando è inattiva.

Accesso ai dati

  • Se possibile, prelettura del contenuto.
  • Memorizzare nella cache il contenuto costoso da accedere.
  • In caso di cache miss, mostra il più rapidamente possibile un segnaposto nell'interfaccia utente che indichi che l'app sta ancora caricando i contenuti.

Strumento per il monitoraggio delle prestazioni

Mentre programmi, aggiungi codice che registri messaggi ed eventi in punti specifici durante l’esecuzione dell’app. In seguito, usare strumenti di profilatura come Windows Performance Recorder e Windows analizzatore prestazioni (inclusi entrambi nella Windows Performance Toolkit) per creare e visualizzare un report sulle prestazioni dell'app.

Windows fornisce API di registrazione supportate da Event Tracing for Windows (ETW) che offrono una soluzione avanzata di registrazione e traccia degli eventi. Le API nello spazio dei nomi Windows.Foundation.Diagnostics includono le classi FileLoggingSession, LoggingActivity, LoggingChannel e LoggingSession.

// using Windows.Foundation.Diagnostics;

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");
myLoggingChannel.LogMessage("Here's my logged message.", LoggingLevel.Information);

Per registrare gli eventi di avvio e arresto in un periodo di tempo:

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");
LoggingActivity myLoggingActivity;

using (myLoggingActivity = new LoggingActivity("MyLoggingActivity", myLoggingChannel))
{
    // A start event is logged when the activity begins.
    // Add code here to do something of interest.
}
// An end event is logged when the activity ends.

Testare e misurare gli obiettivi di prestazioni

Usare queste tecniche e strumenti per testare il modo in cui l'app si sovrapporrà agli obiettivi di prestazioni:

  • Eseguire test su un'ampia gamma di configurazioni hardware, tra cui desktop, portatili, ultrabook e tablet.
  • Eseguire test su un'ampia gamma di dimensioni dello schermo. Le schermate più ampie mostrano più contenuto, che può influire negativamente sulle prestazioni.
  • Elimina quante più variabili di test possibile:
    • Disattivare le app in background nel dispositivo di test.
    • Compila l'app nella configurazione Release prima di distribuirla sul dispositivo di test.
    • Eseguire l'app più volte per eliminare le variabili di test casuali e garantire misurazioni coerenti.
  • Verificare la ridotta disponibilità di alimentazione. I dispositivi degli utenti potrebbero avere una potenza significativamente inferiore rispetto al computer di sviluppo.
  • Usare una combinazione di strumenti come Visual Studio strumenti di diagnostica e Windows analizzatore prestazioni per misurare le prestazioni dell'app.

Rispondere ai risultati dei test delle prestazioni

Dopo aver analizzato i risultati dei test delle prestazioni, determinare se sono necessarie modifiche:

  • È necessario modificare le decisioni di progettazione dell'app o ottimizzare il codice?
  • È necessario aggiungere, rimuovere o modificare la strumentazione nel codice?
  • È necessario rivedere gli obiettivi di prestazioni?

Se sono necessarie modifiche, apportarle e tornare alla strumentazione o al test.

Optimize

Ottimizzare solo i percorsi di codice critici per le prestazioni nell'app, ovvero quelli in cui viene impiegato il maggior tempo. La profilazione ti dice quali sono queste aree. Spesso, esiste un compromesso tra procedure di progettazione consigliate e codice che esegue al massimo l'ottimizzazione. Classificare in ordine di priorità la produttività degli sviluppatori e una buona progettazione del software in aree in cui le prestazioni non sono un problema.