2011-09-17 14 views
16

Zostałem poproszony o zmniejszenie czasu uruchamiania aplikacji na iOS. Jestem ogólnie zaznajomiony z platformą/narzędziami, ale nie skupiałem się wcześniej na czasie uruchamiania aplikacji. Zastanawiam się, czy są znane wzorce do zaatakowania tego problemu?Kanoniczna metoda pomiaru wydajności uruchamiania aplikacji iOS?

Zdaję sobie sprawę, że mogę po prostu zmierzyć czas potrzebny na przejście z głównej() do zakończenia application:didFinishLaunchingWithOptions: (która obejmuje wszystkie zadania ładowania w tle), ale znowu mam nadzieję, że może być bardziej znormalizowany sposób to.

Wszelkie sugestie będą mile widziane!

-M

Odpowiedz

1

Twoja metoda brzmi jak poprawny (polecam przy użyciu CFAbsoluteTime dla pomiarów).

Jedną z rzeczy, które mogą pomóc w skróceniu czasu uruchamiania, jest uniknięcie załadowania kontrolerów podglądu ze stalówek podczas uruchamiania aplikacji. Jeśli się nie mylę, zmusza je do wczytania do pamięci, jeszcze zanim uruchomi się twoja aplikacja. Zamiast tego przydzielaj i edytuj kontrolery widoku dynamicznie, kiedy ich potrzebujesz. Zauważ, że wciąż możesz mieć Widoki, które chcesz załadować, przez kontrolery widoku przechowywane w Stalówce, nie musisz przestać używać IB. Po prostu nie używaj IB do ustawiania statycznych punktów sprzedaży dla delegatów aplikacji.

13

z WWDC 2012 sesja 235

ustawić punkt początkowy w pierwszej linii kodu w main.m

#import <UIKit/UIKit.h> 

CFAbsoluteTime StartTime; 

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

    @autoreleasepool { 
     ... 

ustawić punkt końcowy gdzieś w AppDelegate „s application:didFinishLaunchingWithOptions:

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

Dlaczego ty 'dispatch_async' to? Pomoże to w pomiarze czasu, ponieważ kolejkujesz w następnej pętli. Prawdopodobnie nie jest to duża różnica, ale wydaje się zupełnie niepotrzebnym źródłem niedokładności. –

+3

Funkcja @jshier 'dispatch_async' jest używana w taki sposób, że dziennik jest drukowany, gdy użytkownik może faktycznie wejść w interakcję z aplikacją. Główna kolejka jest zablokowana w 'application: didFinishLaunchingWithOptions', i chcemy wiedzieć kiedy główny wątek jest faktycznie zakończony z całą jego pracą. – bclymer

+0

To jest trochę niezręczne, 'application: didFinishLaunchingWithOptions' jest w głównym wątku, więc dlaczego musimy ponownie wysłać główny wątek? Myślę, że zatrzymanie timera na pierwszym 'viewDidAppear' może być trochę bardziej sensowne, ale nie oglądałem sesji, może czegoś brakuje. – Zorayr

Powiązane problemy