@@ -19,6 +19,7 @@ import {
1919
2020interface IProps {
2121 experimentalSchedulerEnabled ?: boolean ;
22+ experimentalSchedulerLayoutCalculatorEnabled ?: boolean ;
2223}
2324
2425interface 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