2013-06-13 10 views
12

Sto misurando le prestazioni della mia app con systrace su un Nexus 4 non root su Android 4.2.2. Sto vedendo alcune cose nei rapporti che non hanno senso per me e mi chiedo se potrebbero essere dei bug systrace o se qualcuno potrebbe sapere di eventuali cause alla radice di questi sintomi.Causa della ricorsione di PerformTraversals, tempi lunghi di scambio buffer egl

1- Grande ricorsione sotto performTraversals al termine di una corsa

Link to Report - Si prega di consultare la grande curva alla fine della corsa (~ 18 anni). La mia comprensione è stata che performTraversals è a livello di framework, dove disegna un singolo frame dell'interfaccia utente. Quindi non aveva senso per me che ci potessero essere chiamate ricorsive al di sotto di esso. Anche perché ottengo questo tipo di stack esponenziale alla fine di una corsa, ho pensato che fosse davvero solo un difetto in systrace per i dati alla fine di una corsa. È possibile questo tipo di ricorsione? Cosa significa?

2- performTraversals ricorsione nel mezzo di una corsa con lunghi tempi di tampone di swap

Link to Report - comportamento Interessante partire intorno alla seconda tacca 12. Quando ho visto qualcosa di simile nel mezzo di una corsa mi ha fatto pensare che forse non dovrei scrivere questo. Inoltre, ho speso un sacco di tempo cercando di capire che cosa potrebbe rappresentare un così lungo eglSwapBuffers/queueBuffer (la mia app non usa openGL e usa solo il framework direttamente) senza alcun risultato, quando un collega mi ha detto di ignorarlo perché lo scambio dei buffer sarà sempre istantaneo. Potrebbe esserci di più? C'è qualcosa da investigare qui?

risposta

4

Nel rapporto n. 1, il buffer di traccia per la CPU 0 si riempie per circa 5 secondi (notare l'assenza di dati nella riga "CPU 0"). Inizierai a vedere cose che iniziano e non finiscono mai, perché il record di fine non è stato registrato. Ecco perché ottieni i grossi blob "performTraversals (did not Finish)".

Stessa storia nella relazione # 2 - corse fuori circa 10 secondi in

È possibile aumentare la dimensione del buffer con il flag "-b", per esempio. -b 8192 ti darebbe un buffer da 8 MB. La dimensione predefinita è 2 MB.

+0

Affascinante, grazie! In precedenza avevo assunto che con systrace Android riempiva internamente un buffer e lo svuotava in modo asincrono quando si avvicinava al pieno. Ma dalla tua risposta deduco che è sbagliato e che i buffer si riempiono e quando ciò accade, smette efficacemente di tracciare. Trovo anche che questo è su una base per-cpu, quindi l'attività su cpu 1 potrebbe continuare a essere seguita dopo che cpu 0 si è riempita se cpu 1 ha avuto meno attività dall'inizio della traccia. È corretto? –

+0

Sì. Ogni core della CPU ha un buffer separato in modo che il codice di registrazione possa scrivere su di esso senza la necessità di utilizzare blocchi o operazioni atomiche. – fadden

Problemi correlati