Skip to content

Commit 4e9540e

Browse files
authored
[Fiber] Log the Render/Commit phases and the gaps in between (#31016)
A slight behavior change here too is that I now mark the start of the commit phase before the BeforeMutationEffect phase. This affects `<Profiler>` too. The named sequences are as follows: Render -> Suspended or Throttled -> Commit -> Waiting for Paint -> Remaining Effects The Suspended phase is only logged if we delay the Commit due to CSS / images. The Throttled phase is only logged if we delay the commit due to the Suspense throttling timer. <img width="1246" alt="Screenshot 2024-09-20 at 9 14 23 PM" src="https://github.com/user-attachments/assets/8d01f444-bb85-472b-9b42-6157d92c81b4"> I don't yet log render phases that don't complete. I think I also need to special case renders that or don't commit after being suspended.
1 parent 5d19e1c commit 4e9540e

File tree

6 files changed

+184
-44
lines changed

6 files changed

+184
-44
lines changed

packages/react-reconciler/src/ReactFiberCommitEffects.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ function safelyCallDestroy(
899899
function commitProfiler(
900900
finishedWork: Fiber,
901901
current: Fiber | null,
902-
commitTime: number,
902+
commitStartTime: number,
903903
effectDuration: number,
904904
) {
905905
const {id, onCommit, onRender} = finishedWork.memoizedProps;
@@ -918,7 +918,7 @@ function commitProfiler(
918918
finishedWork.actualDuration,
919919
finishedWork.treeBaseDuration,
920920
finishedWork.actualStartTime,
921-
commitTime,
921+
commitStartTime,
922922
);
923923
}
924924

@@ -928,7 +928,7 @@ function commitProfiler(
928928
finishedWork.memoizedProps.id,
929929
phase,
930930
effectDuration,
931-
commitTime,
931+
commitStartTime,
932932
);
933933
}
934934
}
@@ -937,7 +937,7 @@ function commitProfiler(
937937
export function commitProfilerUpdate(
938938
finishedWork: Fiber,
939939
current: Fiber | null,
940-
commitTime: number,
940+
commitStartTime: number,
941941
effectDuration: number,
942942
) {
943943
if (enableProfilerTimer) {
@@ -948,11 +948,11 @@ export function commitProfilerUpdate(
948948
commitProfiler,
949949
finishedWork,
950950
current,
951-
commitTime,
951+
commitStartTime,
952952
effectDuration,
953953
);
954954
} else {
955-
commitProfiler(finishedWork, current, commitTime, effectDuration);
955+
commitProfiler(finishedWork, current, commitStartTime, effectDuration);
956956
}
957957
} catch (error) {
958958
captureCommitPhaseError(finishedWork, finishedWork.return, error);
@@ -963,7 +963,7 @@ export function commitProfilerUpdate(
963963
function commitProfilerPostCommitImpl(
964964
finishedWork: Fiber,
965965
current: Fiber | null,
966-
commitTime: number,
966+
commitStartTime: number,
967967
passiveEffectDuration: number,
968968
): void {
969969
const {id, onPostCommit} = finishedWork.memoizedProps;
@@ -976,14 +976,14 @@ function commitProfilerPostCommitImpl(
976976
}
977977

978978
if (typeof onPostCommit === 'function') {
979-
onPostCommit(id, phase, passiveEffectDuration, commitTime);
979+
onPostCommit(id, phase, passiveEffectDuration, commitStartTime);
980980
}
981981
}
982982

983983
export function commitProfilerPostCommit(
984984
finishedWork: Fiber,
985985
current: Fiber | null,
986-
commitTime: number,
986+
commitStartTime: number,
987987
passiveEffectDuration: number,
988988
) {
989989
try {
@@ -993,14 +993,14 @@ export function commitProfilerPostCommit(
993993
commitProfilerPostCommitImpl,
994994
finishedWork,
995995
current,
996-
commitTime,
996+
commitStartTime,
997997
passiveEffectDuration,
998998
);
999999
} else {
10001000
commitProfilerPostCommitImpl(
10011001
finishedWork,
10021002
current,
1003-
commitTime,
1003+
commitStartTime,
10041004
passiveEffectDuration,
10051005
);
10061006
}

packages/react-reconciler/src/ReactFiberCommitWork.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ import {
9999
Cloned,
100100
} from './ReactFiberFlags';
101101
import {
102-
commitTime,
103-
completeTime,
102+
commitStartTime,
104103
pushNestedEffectDurations,
105104
popNestedEffectDurations,
106105
bubbleNestedEffectDurations,
@@ -505,7 +504,7 @@ function commitLayoutEffectOnFiber(
505504
commitProfilerUpdate(
506505
finishedWork,
507506
current,
508-
commitTime,
507+
commitStartTime,
509508
profilerInstance.effectDuration,
510509
);
511510
} else {
@@ -2345,7 +2344,7 @@ export function reappearLayoutEffects(
23452344
commitProfilerUpdate(
23462345
finishedWork,
23472346
current,
2348-
commitTime,
2347+
commitStartTime,
23492348
profilerInstance.effectDuration,
23502349
);
23512350
} else {
@@ -2568,6 +2567,7 @@ export function commitPassiveMountEffects(
25682567
finishedWork: Fiber,
25692568
committedLanes: Lanes,
25702569
committedTransitions: Array<Transition> | null,
2570+
renderEndTime: number, // Profiling-only
25712571
): void {
25722572
resetComponentEffectTimers();
25732573

@@ -2576,7 +2576,7 @@ export function commitPassiveMountEffects(
25762576
finishedWork,
25772577
committedLanes,
25782578
committedTransitions,
2579-
enableProfilerTimer && enableComponentPerformanceTrack ? completeTime : 0,
2579+
enableProfilerTimer && enableComponentPerformanceTrack ? renderEndTime : 0,
25802580
);
25812581
}
25822582

@@ -2763,7 +2763,7 @@ function commitPassiveMountOnFiber(
27632763
finishedWork.alternate,
27642764
// This value will still reflect the previous commit phase.
27652765
// It does not get reset until the start of the next commit phase.
2766-
commitTime,
2766+
commitStartTime,
27672767
profilerInstance.passiveEffectDuration,
27682768
);
27692769
} else {

packages/react-reconciler/src/ReactFiberPerformanceTrack.js

+65
Original file line numberDiff line numberDiff line change
@@ -164,3 +164,68 @@ export function logTransitionStart(
164164
}
165165
}
166166
}
167+
168+
export function logRenderPhase(startTime: number, endTime: number): void {
169+
if (supportsUserTiming) {
170+
reusableComponentDevToolDetails.color = 'primary-dark';
171+
reusableComponentOptions.start = startTime;
172+
reusableComponentOptions.end = endTime;
173+
performance.measure('Render', reusableComponentOptions);
174+
}
175+
}
176+
177+
export function logSuspenseThrottlePhase(
178+
startTime: number,
179+
endTime: number,
180+
): void {
181+
// This was inside a throttled Suspense boundary commit.
182+
if (supportsUserTiming) {
183+
reusableComponentDevToolDetails.color = 'secondary-light';
184+
reusableComponentOptions.start = startTime;
185+
reusableComponentOptions.end = endTime;
186+
performance.measure('Throttled', reusableComponentOptions);
187+
}
188+
}
189+
190+
export function logSuspendedCommitPhase(
191+
startTime: number,
192+
endTime: number,
193+
): void {
194+
// This means the commit was suspended on CSS or images.
195+
if (supportsUserTiming) {
196+
reusableComponentDevToolDetails.color = 'secondary-light';
197+
reusableComponentOptions.start = startTime;
198+
reusableComponentOptions.end = endTime;
199+
performance.measure('Suspended', reusableComponentOptions);
200+
}
201+
}
202+
203+
export function logCommitPhase(startTime: number, endTime: number): void {
204+
if (supportsUserTiming) {
205+
reusableComponentDevToolDetails.color = 'secondary-dark';
206+
reusableComponentOptions.start = startTime;
207+
reusableComponentOptions.end = endTime;
208+
performance.measure('Commit', reusableComponentOptions);
209+
}
210+
}
211+
212+
export function logPaintYieldPhase(startTime: number, endTime: number): void {
213+
if (supportsUserTiming) {
214+
reusableComponentDevToolDetails.color = 'secondary-light';
215+
reusableComponentOptions.start = startTime;
216+
reusableComponentOptions.end = endTime;
217+
performance.measure('Waiting for Paint', reusableComponentOptions);
218+
}
219+
}
220+
221+
export function logPassiveCommitPhase(
222+
startTime: number,
223+
endTime: number,
224+
): void {
225+
if (supportsUserTiming) {
226+
reusableComponentDevToolDetails.color = 'secondary-dark';
227+
reusableComponentOptions.start = startTime;
228+
reusableComponentOptions.end = endTime;
229+
performance.measure('Remaining Effects', reusableComponentOptions);
230+
}
231+
}

0 commit comments

Comments
 (0)