@samitouri / QOS-React / commits / 103503eb69

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