2011-09-17 14 views
16

Mi è stato chiesto di ridurre il tempo di avvio di un'applicazione iOS. Conosco molto bene la piattaforma/gli strumenti in generale, ma non mi sono concentrato sui tempi di avvio delle applicazioni precedenti. Mi chiedo se ci sono modelli noti per attaccare questo problema?Metodo canonico per misurare le prestazioni di avvio dell'app iOS?

Mi rendo conto che posso semplicemente misurare il tempo necessario per passare da main() al completamento di application:didFinishLaunchingWithOptions: (che include qualsiasi attività di caricamento in background), ma ancora una volta, spero che ci possa essere un modo più standardizzato di fare Questo.

Qualsiasi suggerimento sarebbe molto apprezzato!

-M

risposta

1

Il tuo metodo suona come quella corretta (mi consiglia di utilizzare CFAbsoluteTime per le vostre misure).

Una cosa che può aiutare a ridurre il tempo di avvio è evitare di avere i controller di vista caricati dai pennini all'avvio dell'applicazione. Se non sbaglio, questo li costringe a caricarli in memoria anche prima dell'avvio dell'app. Invece, allocare e avviare i controller di visualizzazione in modo dinamico quando ne avete bisogno. Tieni presente che puoi ancora avere le viste che desideri vengano caricate dai controller della vista memorizzati in Nibs, non devi smettere di usare IB. Basta non usare IB per impostare le prese statiche per il tuo delegato dell'app.

13

dal WWDC 2012 sessione 235

impostare il punto di inizio alla prima riga di codice nel main.m

#import <UIKit/UIKit.h> 

CFAbsoluteTime StartTime; 

int main(int argc, char *argv[]) 
{ 
    StartTime = CFAbsoluteTimeGetCurrent(); 

    @autoreleasepool { 
     ... 

impostare il punto finale da qualche parte nel s AppDelegate' application:didFinishLaunchingWithOptions:

extern CFAbsoluteTime StartTime; 
... 
dispatch_async(dispatch_get_main_queue(), ^{ 
    NSLog(@"Launched in %f sec", CFAbsoluteTimeGetCurrent() - StartTime); 
}); 
+0

Perché sarebbe hai 'dispatch_async' quello? Si tratterà della misurazione della temporizzazione poiché si fa la coda nel ciclo di esecuzione successivo. Probabilmente non è una grande differenza, ma sembra una fonte di inesattezza completamente inutile. –

+3

@jshier 'dispatch_async' viene utilizzato in modo che il log venga stampato quando l'utente può effettivamente interagire con l'app. La coda principale è bloccata in 'application: didFinishLaunchingWithOptions', e vogliamo sapere quando il thread principale è effettivamente finito con tutto il suo lavoro. – bclymer

+0

Questo è un po 'scomodo, 'applicazione: didFinishLaunchingWithOptions' è sul thread principale, quindi perché è necessario inviare nuovamente il thread principale? Penso che fermare il timer sul primo 'viewDidAppear' potrebbe essere un po 'più ragionevole, ma non ho visto la sessione, potrebbe mancare qualcosa. – Zorayr

Problemi correlati