2013-06-13 5 views
12

Ich bemesse die Leistung meiner App mit systrace auf einem nicht gerooteten Nexus 4 auf Android 4.2.2. Ich sehe ein paar Dinge in den Berichten, die für mich keinen Sinn ergeben, und ich frage mich, ob es sich um Systrace-Bugs handelt oder ob irgendjemand irgendwelche möglichen Ursachen für diese Symptome kennt.Ursache von performTraversals Rekursion, lange egl Pufferwechselzeiten

1- Große Rekursion unter performTraversals am Ende eines Laufes

Link to Report - Bitte beachten Sie die große Kurve am Ende des Laufes (~ 18s). Mein Verständnis war, dass performTraversals auf der Framework-Ebene ist, wo es einen einzelnen Rahmen der Benutzeroberfläche zeichnet. Also ergab es für mich keinen Sinn, dass es rekursive Aufrufe geben könnte. Auch weil ich diese exponentielle Stapelung am Ende eines Laufs erhalte, nahm ich an, dass dies am Ende eines Laufs nur ein Fehler in der Systrace für Daten war. Ist diese Art von Rekursion möglich? Was heißt das?

2- performTraversals Rekursion in der Mitte eines langen Durchlauf mit Pufferauslagerungszeiten

Link to Report - interessantes Verhalten rund um die 12-Sekunden-Marke beginnt. Als ich mitten im Lauf etwas Ähnliches sah, dachte ich, dass ich das vielleicht nicht schreiben sollte. Außerdem habe ich viel Zeit damit verbracht, herauszufinden, was für einen so langen eglSwapBuffers/queueBuffer (meine App nutzt nicht openGL und benutzt nur das Framework direkt) vergeblich war, als ein Kollege sagte, ich solle es einfach ignorieren weil Swapping-Puffer immer sofort sein werden. Könnte da mehr dran sein? Gibt es hier etwas zu untersuchen?

Antwort

4

In Bericht # 1 füllte der Trace-Puffer für CPU 0 etwa 5 Sekunden in (beachten Sie die Abwesenheit von Daten in der Zeile "CPU 0"). Du beginnst Dinge zu sehen, die beginnen und niemals enden, weil der End-Record nicht aufgezeichnet wurde. Deshalb erhalten Sie die großen "performTraverals (Did not Finish)" - Blobs.

gleiche Geschichte in Bericht # 2 - lief ca. 10 Sekunden in

Sie können die Puffergröße mit der „-b“ Flagge erhöhen, z. -b 8192 würde Ihnen einen 8 MB Puffer geben. Die Standardgröße beträgt 2 MB.

+0

Faszinierend, danke! Ich hatte vorher angenommen, dass mit Systrace Android intern einen Puffer füllte und dann asynchron spülte, als es fast voll war. Aber ich entnehme Ihrer Antwort, dass das falsch ist, und die Puffer füllen sich gerade und wenn das passiert, hört es effektiv auf zu verfolgen. Ich nehme auch an, dass dies auf einer Pro-CPU-Basis ist, so dass Aktivität auf CPU 1 weiterhin verfolgt werden kann, nachdem CPU 0 aufgefüllt wurde, wenn CPU 1 seit Beginn der Ablaufverfolgung weniger Aktivität hatte. Ist das korrekt? –

+0

Ja. Jeder CPU-Kern verfügt über einen separaten Puffer, sodass der Protokollierungscode darauf schreiben kann, ohne Sperren oder atomare Ops verwenden zu müssen. – fadden