@@ -79,6 +79,9 @@ import {
79
79
logCommitPhase ,
80
80
logPaintYieldPhase ,
81
81
logPassiveCommitPhase ,
82
+ logYieldTime ,
83
+ logActionYieldTime ,
84
+ logSuspendedYieldTime ,
82
85
} from './ReactFiberPerformanceTrack' ;
83
86
84
87
import {
@@ -264,6 +267,9 @@ import {
264
267
stopProfilerTimerIfRunningAndRecordIncompleteDuration ,
265
268
markUpdateAsRepeat ,
266
269
trackSuspendedTime ,
270
+ startYieldTimer ,
271
+ yieldStartTime ,
272
+ yieldReason ,
267
273
} from './ReactProfilerTimer' ;
268
274
import { setCurrentTrackFromLanes } from './ReactFiberPerformanceTrack' ;
269
275
@@ -351,7 +357,7 @@ let workInProgress: Fiber | null = null;
351
357
// The lanes we're rendering
352
358
let workInProgressRootRenderLanes : Lanes = NoLanes ;
353
359
354
- opaque type SuspendedReason = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ;
360
+ export opaque type SuspendedReason = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ;
355
361
const NotSuspended : SuspendedReason = 0 ;
356
362
const SuspendedOnError : SuspendedReason = 1 ;
357
363
const SuspendedOnData : SuspendedReason = 2 ;
@@ -915,6 +921,24 @@ export function performWorkOnRoot(
915
921
throw new Error ( 'Should not already be working.' ) ;
916
922
}
917
923
924
+ if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
925
+ if ( workInProgressRootRenderLanes !== NoLanes && workInProgress !== null ) {
926
+ const yieldedFiber = workInProgress ;
927
+ // We've returned from yielding to the event loop. Let's log the time it took.
928
+ const yieldEndTime = now ( ) ;
929
+ switch ( yieldReason ) {
930
+ case SuspendedOnData :
931
+ logSuspendedYieldTime ( yieldStartTime , yieldEndTime , yieldedFiber ) ;
932
+ break ;
933
+ case SuspendedOnAction :
934
+ logActionYieldTime ( yieldStartTime , yieldEndTime , yieldedFiber ) ;
935
+ break ;
936
+ default :
937
+ logYieldTime ( yieldStartTime , yieldEndTime ) ;
938
+ }
939
+ }
940
+ }
941
+
918
942
// We disable time-slicing in some cases: if the work has been CPU-bound
919
943
// for too long ("expired" work, to prevent starvation), or we're in
920
944
// sync-updates-by-default mode.
@@ -956,6 +980,12 @@ export function performWorkOnRoot(
956
980
const didAttemptEntireTree = false ;
957
981
markRootSuspended ( root , lanes , NoLane , didAttemptEntireTree ) ;
958
982
}
983
+ if ( enableProfilerTimer && enableComponentPerformanceTrack ) {
984
+ // We're about to yield. Let's keep track of how long we yield to the event loop.
985
+ // We also stash the suspended reason at the time we yielded since it might have
986
+ // changed when we resume such as when it gets pinged.
987
+ startYieldTimer ( workInProgressSuspendedReason ) ;
988
+ }
959
989
break ;
960
990
} else {
961
991
let renderEndTime = 0 ;
0 commit comments