Only measure "base" times within ProfileMode (#12821)
* Conditionally start/stop base timer only within Profile mode tree * Added test to ensure ProfilerTimer not called outside of Profiler root
Brian Vaughn committed
May 15, 2018 at 12:43 UTC
103503eb69d899de4ed127b2473201db1c30d027
2 files changed
+28
-5
packages/react-reconciler/src/ReactFiberScheduler.js
+9
-4
@@ -962,12 +962,17 @@ export default function<T, P, I, TI, HI, PI, C, CC, CX, PL>(
962
963
let next;
964
if (enableProfilerTimer) {
965
- startBaseRenderTimer();
965
+ if (workInProgress.mode & ProfileMode) {
966
+ startBaseRenderTimer();
967
+ }
968
+
969
next = beginWork(current, workInProgress, nextRenderExpirationTime);
970
968
- // Update "base" time if the render wasn't bailed out on.
969
- recordElapsedBaseRenderTimeIfRunning(workInProgress);
970
- stopBaseRenderTimerIfRunning();
971
+ if (workInProgress.mode & ProfileMode) {
972
+ // Update "base" time if the render wasn't bailed out on.
973
+ recordElapsedBaseRenderTimeIfRunning(workInProgress);
974
+ stopBaseRenderTimerIfRunning();
975
+ }
976
} else {
977
next = beginWork(current, workInProgress, nextRenderExpirationTime);
978
}
packages/react/src/__tests__/ReactProfiler-test.internal.js
+19
-1
@@ -108,10 +108,14 @@ describe('Profiler', () => {
108
describe('onRender callback', () => {
109
let AdvanceTime;
110
let advanceTimeBy;
111
+ let mockNow;
112
113
const mockNowForTests = () => {
114
let currentTime = 0;
114
- ReactTestRenderer.unstable_setNowImplementation(() => currentTime);
115
+
116
+ mockNow = jest.fn().mockImplementation(() => currentTime);
117
+
118
+ ReactTestRenderer.unstable_setNowImplementation(mockNow);
119
advanceTimeBy = amount => {
120
currentTime += amount;
121
};
@@ -164,6 +168,20 @@ describe('Profiler', () => {
168
expect(callback).toHaveBeenCalledTimes(1);
169
});
170
171
+ it('does not record times for components outside of Profiler tree', () => {
172
+ ReactTestRenderer.create(
173
+ <div>
174
+ <AdvanceTime />
175
+ <AdvanceTime />
176
+ <AdvanceTime />
177
+ </div>,
178
+ );
179
+
180
+ // Should only be called twice, for normal expiration time purposes.
181
+ // No additional calls from ProfilerTimer are expected.
182
+ expect(mockNow).toHaveBeenCalledTimes(2);
183
+ });
184
+
185
it('logs render times for both mount and update', () => {
186
const callback = jest.fn();
187