2012-10-21 11 views
5

Sto cercando alcuni consigli su come utilizzare il Time Profiler di Instruments per migliorare un'operazione specifica. Dispongo di una visualizzazione a scorrimento di pagine che carica il suo contenuto su richiesta. Mentre si scorre una nuova pagina, un'altra viene caricata di due pagine a destra. Ciò accade quando si scorre la pagina corrente al 50% dello schermo, e su dispositivi più lenti il ​​caricamento è sufficiente di un collo della bottiglia che interrompe la scorrevolezza del rotolo. La pergamena si sente come se si fermasse molto brevemente al 50% della pinta e poi salta di nuovo in azione.Prestazioni di benchmarking utilizzando gli strumenti

Devo notare che non c'è alcun componente di rete per la mia applicazione, quindi il collo di bottiglia non è durante il recupero dei dati - è tutto nel caricamento della nuova vista.

Mentre lavoro per migliorare questo, ho bisogno di confrontare la transizione in modo da poter valutare l'effetto dei miei miglioramenti. Dopo aver visto le sessioni del WWDC, capisco le basi del profiler del tempo, ma non sono sicuro di guardare la cosa giusta.

Sto eseguendo lo strumento e quindi eseguendo lo scorrimento. Vedo il picco previsto nell'attività della CPU. Sto quindi selezionando lo spike e osservando i nomi dei simboli. Come puoi vedere qui sotto, quando nascondo le librerie di sistema e mostro Obj-C, sto facendo un breve picco del 90% con 81.0 ms di tempo di esecuzione.

enter image description here

La mia confusione arriva quando ho drill-down per il mio codice. Trovo che uno dei più grandi contributori (23 ms) è una piccola routine che utilizza solo sortedArrayUsingDescriptors. Non c'è molto che posso fare per quello. Altre volte la causa principale sarà l'utilizzo di CGRectInset - qualche altro millisecondo. Credo che mi sarei aspettato di vedere più legati all'utilizzo di immagini o qualcosa del genere.

Immagino di non sapere se sto analizzando le cose giuste. Sono davvero intenzionato a provare a ridurre le mie operazioni da 6ms fino a 5 ms e aspetto di vedere una differenza? Sto guardando gli strumenti giusti per diagnosticare il mio problema?

Eventuali suggerimenti o istruzioni su cosa misurare e su dove concentrare i miei sforzi sarebbero davvero apprezzati.

+0

Se l'ordinamento dell'array richiede tempo, è lì che devi concentrare i tuoi sforzi. Perché stai ordinando la matrice allora? Può essere pre-ordinato? Deve essere un array? – jrturton

+1

E sembra che tu stia facendo la cosa giusta per quanto riguarda i tuoi strumenti. Quel metodo e cellForRowAtIndexPath sembra essere il posto dove trascorre la maggior parte del tuo tempo. Fare doppio clic per mostrare gli hotspot effettivi nel codice sorgente. – jrturton

+0

Grazie per dare un'occhiata. Ho una classe di dati di base con un set di elementi. Per comodità, ho aggiunto un metodo orderedItems a quella classe. Per esempio, quando ho bisogno del testo per una cella, uso gli Item ordinati per trovare l'elemento corretto. Forse posso sbarazzarmi di qualche ms memorizzando nella cache questo sulla classe e in qualche modo aggiornandolo ogni volta che gli elementi cambiano. –

risposta

1

Considerare l'utilizzo del dispatch centrale per fare tutto il lavoro non UI (raccolta, ordinamento, selezione ecc.) Il più possibile su un thread in background. Questo sfrutterà la potenza delle macchine multi-cpu e ti farà uscire più velocemente dal thread principale. Utilizzare solo il thread principale per ui lavorare secondo necessità.

Problemi correlati