From 76bfd67cd964a8da40c19074818acc7477e9ad07 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Thu, 16 Mar 2023 07:35:44 -0700 Subject: [PATCH] PerformanceStatsEvent Summary: ^ Reviewed By: aigoncharov Differential Revision: D44062826 fbshipit-source-id: 3f66411a8648e635b75dfea29a6256e64cfbf5d5 --- .../plugins/uidebugger/model/Events.kt | 16 ++++----- .../uidebugger/observers/TreeObserver.kt | 13 +++---- .../observers/TreeObserverManager.kt | 36 ++++++++++--------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt index 4fca29a9b..09c0d6f7c 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/model/Events.kt @@ -42,16 +42,16 @@ data class SubtreeUpdateEvent( data class PerfStatsEvent( val txId: Long, val observerType: String, + val nodesCount: Int, val start: Long, - val traversalComplete: Long, - val snapshotComplete: Long, - val queuingComplete: Long, - val deferredComputationComplete: Long, - val serializationComplete: Long, - val socketComplete: Long, - val nodesCount: Int + val traversalMS: Long, + val snapshotMS: Long, + val queuingMS: Long, + val deferredComputationMS: Long, + val serializationMS: Long, + val socketMS: Long ) { companion object { - const val name = "perfStats" + const val name = "performanceStats" } } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt index 8cab32093..061af2eaa 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserver.kt @@ -46,7 +46,7 @@ abstract class TreeObserver { snapshotBitmap: BitmapPool.ReusableBitmap? = null, frameworkEvents: List? = null ) { - val startTimestamp = System.currentTimeMillis() + val traversalStartTimestamp = System.currentTimeMillis() val (visitedNodes, observableRoots) = context.layoutTraversal.traverse(root) // Add any new observers @@ -79,7 +79,7 @@ abstract class TreeObserver { } removables.forEach { key -> children.remove(key) } - val traversalCompleteTime = System.currentTimeMillis() + val traversalEndTimestamp = System.currentTimeMillis() if (snapshotBitmap != null) { @Suppress("unchecked_cast") @@ -89,16 +89,17 @@ abstract class TreeObserver { descriptor.getSnapshot(root, snapshotBitmap.bitmap) } - val snapshotCompleteTime = System.currentTimeMillis() + val snapshotEndTimestamp = System.currentTimeMillis() context.treeObserverManager.enqueueUpdate( SubtreeUpdate( type, root.objectIdentity(), visitedNodes, - startTimestamp, - traversalCompleteTime, - snapshotCompleteTime, + traversalStartTimestamp, + snapshotEndTimestamp, + (traversalEndTimestamp - traversalStartTimestamp), + (snapshotEndTimestamp - traversalEndTimestamp), frameworkEvents, snapshotBitmap)) } diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt index 17f8545ad..0cd45e99f 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/TreeObserverManager.kt @@ -35,9 +35,10 @@ data class SubtreeUpdate( val observerType: String, val rootId: Id, val deferredNodes: List>, - val startTime: Long, - val traversalCompleteTime: Long, - val snapshotComplete: Long, + val timestamp: Long, + val queuedTimestamp: Long, + val traversalMS: Long, + val snapshotMS: Long, val frameworkEvents: List?, val snapshot: BitmapPool.ReusableBitmap? ) @@ -99,16 +100,16 @@ class TreeObserverManager(val context: UIDContext) { } private fun sendBatchedUpdate(batchedUpdate: BatchedUpdate) { - Log.i( LogTag, "Got update from ${batchedUpdate.updates.size} observers at time ${batchedUpdate.frameTimeMs}") - val onWorkerThread = System.currentTimeMillis() + + val workerThreadStartTimestamp = System.currentTimeMillis() val nodes = batchedUpdate.updates.flatMap { it.deferredNodes.map { it.value() } } val frameworkEvents = batchedUpdate.updates.flatMap { it.frameworkEvents ?: listOf() } val snapshotUpdate = batchedUpdate.updates.find { it.snapshot != null } - val deferredComptationComplete = System.currentTimeMillis() + val deferredComputationEndTimestamp = System.currentTimeMillis() var snapshot: String? = null if (snapshotUpdate?.snapshot != null) { @@ -134,25 +135,26 @@ class TreeObserverManager(val context: UIDContext) { snapshot, frameworkEvents)) - val serializationEnd = System.currentTimeMillis() + val serialisationEndTimestamp = System.currentTimeMillis() context.connectionRef.connection?.send(SubtreeUpdateEvent.name, serialized) - val socketEnd = System.currentTimeMillis() + val socketEndTimestamp = System.currentTimeMillis() Log.i(LogTag, "Sent event for batched subtree update with nodes with ${nodes.size}") val perfStats = PerfStatsEvent( txId = batchedUpdate.frameTimeMs, observerType = "batched", - start = batchedUpdate.updates.minOf { it.startTime }, - traversalComplete = batchedUpdate.updates.maxOf { it.traversalCompleteTime }, - snapshotComplete = batchedUpdate.updates.maxOf { it.snapshotComplete }, - queuingComplete = onWorkerThread, - deferredComputationComplete = deferredComptationComplete, - serializationComplete = serializationEnd, - socketComplete = socketEnd, - nodesCount = nodes.size) + nodesCount = nodes.size, + start = batchedUpdate.updates.minOf { it.timestamp }, + traversalMS = batchedUpdate.updates.maxOf { it.traversalMS }, + snapshotMS = batchedUpdate.updates.maxOf { it.snapshotMS }, + queuingMS = + workerThreadStartTimestamp - batchedUpdate.updates.minOf { it.queuedTimestamp }, + deferredComputationMS = (deferredComputationEndTimestamp - workerThreadStartTimestamp), + serializationMS = (serialisationEndTimestamp - deferredComputationEndTimestamp), + socketMS = (socketEndTimestamp - serialisationEndTimestamp)) context.connectionRef.connection?.send( PerfStatsEvent.name, Json.encodeToString(PerfStatsEvent.serializer(), perfStats)) @@ -168,7 +170,7 @@ class TreeObserverManager(val context: UIDContext) { } } -/** Buffers up subtree updates untill the frame is complete, should only be called on main thread */ +/** Buffers up subtree updates until the frame is complete, should only be called on main thread */ private class SubtreeUpdateBuffer(private val onBatchReady: (BatchedUpdate) -> Unit) { private val bufferedSubtreeUpdates = mutableListOf()