Skip to content

Commit ef5f641

Browse files
committed
feat(Scheduler): increase precision of layout measurement
Attempt to optimize measurments for layouts after the JS handlers are executed. See #14
1 parent fd7001d commit ef5f641

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

examples/index.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ const HooksExample = () => {
173173
};
174174

175175
render(
176-
<ViewportProvider experimentalSchedulerEnabled>
176+
<ViewportProvider
177+
experimentalSchedulerEnabled
178+
experimentalSchedulerLayoutCalculatorEnabled
179+
>
177180
<main role="main">
178181
<Example />
179182
<HooksExample />
@@ -188,7 +191,10 @@ render(
188191

189192
setInterval(() => {
190193
render(
191-
<ViewportProvider experimentalSchedulerEnabled>
194+
<ViewportProvider
195+
experimentalSchedulerEnabled
196+
experimentalSchedulerLayoutCalculatorEnabled
197+
>
192198
<main role="main">
193199
<Example />
194200
<HooksExample />

lib/ViewportProvider.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919

2020
interface IProps {
2121
experimentalSchedulerEnabled?: boolean;
22+
experimentalSchedulerLayoutCalculatorEnabled?: boolean;
2223
}
2324

2425
interface IListener extends IViewportChangeOptions {
@@ -95,6 +96,7 @@ export default class ViewportProvider extends React.PureComponent<
9596
> {
9697
static defaultProps: {
9798
experimentalSchedulerEnabled: false;
99+
experimentalSchedulerLayoutCalculatorEnabled: false;
98100
};
99101
private listeners: IListener[] = [];
100102
private updateListenersTick?: NodeJS.Timer;
@@ -118,6 +120,7 @@ export default class ViewportProvider extends React.PureComponent<
118120
{ scrollDidUpdate, dimensionsDidUpdate }: IViewportCollectorUpdateOptions,
119121
options?: { isIdle?: boolean; shouldInitialize?: boolean },
120122
) => {
123+
const getOverallDuration = createPerformanceMarker();
121124
const { isIdle, shouldInitialize } = Object.assign(
122125
{ isIdle: false, shouldInitialize: false },
123126
options,
@@ -168,7 +171,7 @@ export default class ViewportProvider extends React.PureComponent<
168171
return null;
169172
},
170173
);
171-
174+
let overallJSHandlerTotalCost = 0;
172175
updatableListeners.forEach((listener, index) => {
173176
const { handler, averageExecutionCost, iterations } = listener;
174177
const [layout, layoutCost] = layouts[index] || [null, 0];
@@ -182,7 +185,23 @@ export default class ViewportProvider extends React.PureComponent<
182185
listener.averageExecutionCost = averageExecutionCost + diff / i;
183186
listener.iterations = i;
184187
listener.initialized = true;
188+
overallJSHandlerTotalCost += totalCost;
185189
});
190+
if (
191+
this.props.experimentalSchedulerLayoutCalculatorEnabled &&
192+
updatableListeners.length
193+
) {
194+
setTimeout(() => {
195+
const diffPerHandler =
196+
(getOverallDuration() - overallJSHandlerTotalCost) /
197+
updatableListeners.length;
198+
updatableListeners.forEach(listener => {
199+
listener.averageExecutionCost =
200+
listener.averageExecutionCost +
201+
diffPerHandler / listener.iterations;
202+
});
203+
}, 0);
204+
}
186205
};
187206

188207
addViewportChangeListener = (

0 commit comments

Comments
 (0)