6
6
*/
7
7
package com .facebook .react .fabric ;
8
8
9
+ import static com .facebook .infer .annotation .ThreadConfined .UI ;
9
10
import static com .facebook .react .fabric .mounting .LayoutMetricsConversions .getMaxSize ;
10
11
import static com .facebook .react .fabric .mounting .LayoutMetricsConversions .getMinSize ;
11
12
import static com .facebook .react .fabric .mounting .LayoutMetricsConversions .getYogaMeasureMode ;
12
13
import static com .facebook .react .fabric .mounting .LayoutMetricsConversions .getYogaSize ;
13
- import static com .facebook .infer .annotation .ThreadConfined .UI ;
14
14
import static com .facebook .react .uimanager .common .UIManagerType .FABRIC ;
15
15
16
16
import android .annotation .SuppressLint ;
17
+ import android .os .SystemClock ;
17
18
import android .support .annotation .GuardedBy ;
18
19
import android .support .annotation .Nullable ;
19
20
import android .support .annotation .UiThread ;
20
21
import com .facebook .common .logging .FLog ;
22
+ import com .facebook .infer .annotation .Assertions ;
23
+ import com .facebook .infer .annotation .ThreadConfined ;
24
+ import com .facebook .proguard .annotations .DoNotStrip ;
25
+ import com .facebook .react .bridge .GuardedRunnable ;
26
+ import com .facebook .react .bridge .LifecycleEventListener ;
27
+ import com .facebook .react .bridge .NativeMap ;
28
+ import com .facebook .react .bridge .ReactApplicationContext ;
29
+ import com .facebook .react .bridge .ReactContext ;
30
+ import com .facebook .react .bridge .ReadableArray ;
31
+ import com .facebook .react .bridge .ReadableNativeMap ;
32
+ import com .facebook .react .bridge .UIManager ;
33
+ import com .facebook .react .bridge .UiThreadUtil ;
34
+ import com .facebook .react .bridge .WritableMap ;
35
+ import com .facebook .react .common .ReactConstants ;
21
36
import com .facebook .react .fabric .jsi .Binding ;
22
37
import com .facebook .react .fabric .jsi .EventBeatManager ;
23
38
import com .facebook .react .fabric .jsi .EventEmitterWrapper ;
35
50
import com .facebook .react .fabric .mounting .mountitems .UpdateLayoutMountItem ;
36
51
import com .facebook .react .fabric .mounting .mountitems .UpdateLocalDataMountItem ;
37
52
import com .facebook .react .fabric .mounting .mountitems .UpdatePropsMountItem ;
38
- import com .facebook .infer .annotation .Assertions ;
39
- import com .facebook .infer .annotation .ThreadConfined ;
40
- import com .facebook .proguard .annotations .DoNotStrip ;
41
- import com .facebook .react .bridge .GuardedRunnable ;
42
- import com .facebook .react .bridge .LifecycleEventListener ;
43
- import com .facebook .react .bridge .NativeMap ;
44
- import com .facebook .react .bridge .ReactApplicationContext ;
45
- import com .facebook .react .bridge .ReactContext ;
46
- import com .facebook .react .bridge .ReadableArray ;
47
- import com .facebook .react .bridge .ReadableNativeMap ;
48
- import com .facebook .react .bridge .UIManager ;
49
- import com .facebook .react .bridge .UiThreadUtil ;
50
- import com .facebook .react .bridge .WritableMap ;
51
- import com .facebook .react .common .ReactConstants ;
52
53
import com .facebook .react .modules .core .ReactChoreographer ;
53
54
import com .facebook .react .uimanager .IllegalViewOperationException ;
54
55
import com .facebook .react .uimanager .ReactRootViewTagGenerator ;
@@ -109,6 +110,13 @@ public class FabricUIManager implements UIManager, LifecycleEventListener {
109
110
110
111
@ ThreadConfined (UI )
111
112
private boolean mIsMountingEnabled = true ;
113
+ private long mRunStartTime = 0l ;
114
+ private long mBatchedExecutionTime = 0l ;
115
+ private long mNonBatchedExecutionTime = 0l ;
116
+ private long mDispatchViewUpdatesTime = 0l ;
117
+ private long mCommitStartTime = 0l ;
118
+ private long mLayoutTime = 0l ;
119
+ private long mFinishTransactionTime = 0l ;
112
120
113
121
public FabricUIManager (
114
122
ReactApplicationContext reactContext ,
@@ -268,7 +276,17 @@ private long measure(
268
276
*/
269
277
@ DoNotStrip
270
278
@ SuppressWarnings ("unused" )
271
- private void scheduleMountItems (final MountItem mountItems ) {
279
+ private void scheduleMountItems (
280
+ final MountItem mountItems ,
281
+ long commitStartTime ,
282
+ long layoutTime ,
283
+ long finishTransactionStartTime ) {
284
+
285
+ // TODO T31905686: support multithreading
286
+ mCommitStartTime = commitStartTime ;
287
+ mLayoutTime = layoutTime ;
288
+ mFinishTransactionTime = SystemClock .uptimeMillis () - finishTransactionStartTime ;
289
+ mDispatchViewUpdatesTime = SystemClock .uptimeMillis ();
272
290
synchronized (mMountItemsLock ) {
273
291
mMountItems .add (mountItems );
274
292
}
@@ -294,26 +312,32 @@ private void flushMountItems() {
294
312
mPreMountItems = new ArrayList <>();
295
313
}
296
314
315
+ mRunStartTime = SystemClock .uptimeMillis ();
297
316
List <MountItem > mountItemsToDispatch ;
298
317
synchronized (mMountItemsLock ) {
299
318
mountItemsToDispatch = mMountItems ;
300
319
mMountItems = new ArrayList <>();
301
320
}
302
321
322
+ long nonBatchedExecutionStartTime = SystemClock .uptimeMillis ();
303
323
Systrace .beginSection (
304
324
Systrace .TRACE_TAG_REACT_JAVA_BRIDGE ,
305
325
"FabricUIManager::premountViews (" + preMountItemsToDispatch .size () + " batches)" );
306
326
for (MountItem mountItem : preMountItemsToDispatch ) {
307
327
mountItem .execute (mMountingManager );
308
328
}
329
+ mNonBatchedExecutionTime = SystemClock .uptimeMillis () - nonBatchedExecutionStartTime ;
309
330
Systrace .endSection (Systrace .TRACE_TAG_REACT_JAVA_BRIDGE );
310
331
311
332
Systrace .beginSection (
312
333
Systrace .TRACE_TAG_REACT_JAVA_BRIDGE ,
313
334
"FabricUIManager::mountViews (" + mountItemsToDispatch .size () + " batches)" );
335
+
336
+ long batchedExecutionStartTime = SystemClock .uptimeMillis ();
314
337
for (MountItem mountItem : mountItemsToDispatch ) {
315
338
mountItem .execute (mMountingManager );
316
339
}
340
+ mBatchedExecutionTime = SystemClock .uptimeMillis () - batchedExecutionStartTime ;
317
341
Systrace .endSection (Systrace .TRACE_TAG_REACT_JAVA_BRIDGE );
318
342
} catch (Exception ex ) {
319
343
FLog .e (ReactConstants .TAG , "Exception thrown when executing UIFrameGuarded" , ex );
@@ -379,7 +403,9 @@ public void onHostDestroy() {}
379
403
@ Override
380
404
public void dispatchCommand (
381
405
final int reactTag , final int commandId , final ReadableArray commandArgs ) {
382
- scheduleMountItems (new DispatchCommandMountItem (reactTag , commandId , commandArgs ));
406
+ synchronized (mMountItemsLock ) {
407
+ mMountItems .add (new DispatchCommandMountItem (reactTag , commandId , commandArgs ));
408
+ }
383
409
}
384
410
385
411
@ Override
@@ -394,12 +420,20 @@ public void clearJSResponder() {
394
420
395
421
@ Override
396
422
public void profileNextBatch () {
397
- // do nothing for now.
423
+ // TODO T31905686: Remove this method and add support for multi-threading performance counters
398
424
}
399
425
400
426
@ Override
401
427
public Map <String , Long > getPerformanceCounters () {
402
- return new HashMap <>();
428
+ HashMap <String , Long > performanceCounters = new HashMap <>();
429
+ performanceCounters .put ("CommitStartTime" , mCommitStartTime );
430
+ performanceCounters .put ("LayoutTime" , mLayoutTime );
431
+ performanceCounters .put ("DispatchViewUpdatesTime" , mDispatchViewUpdatesTime );
432
+ performanceCounters .put ("RunStartTime" , mRunStartTime );
433
+ performanceCounters .put ("BatchedExecutionTime" , mBatchedExecutionTime );
434
+ performanceCounters .put ("NonBatchedExecutionTime" , mNonBatchedExecutionTime );
435
+ performanceCounters .put ("FinishFabricTransactionTime" , mFinishTransactionTime );
436
+ return performanceCounters ;
403
437
}
404
438
405
439
private class DispatchUIFrameCallback extends GuardedFrameCallback {
0 commit comments