mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/54213 ## Changelog: [Internal] Modifies `VirtualViewContainerStateExperimental` to use an interval tree to store the container's VirtualViews. Interval tree's query allows us to lower the frequently-used updateModes() operation from `O(n)` to `O(m + log n)`, where `m` is the number of VirtualViews in the hysteresis range. General layout changes incur a penalty due to the requirement of maintaining a balanced BST. Performance Changes: * updateModes(): `O(n) -> O(m + log n)` (new algo) * updateMode(): `O(1) -> O(1)` * add VV: `O(1) -> O(log n)` * update VV: `O(1) -> O(log n)` * delete VV: `O(1) -> O(log n)` We expect scrolling to be much more frequent than a total layout change/updating many of the elements in the container at once. However, the initial load of a page will take `O(n log n)` time rather than `O(n)` time. We also include some bookkeeping sets for "old" hysteresis, prerender, and visible VVs. This will increase the memory footprint of `VirtualViewContainerState` by `O(m)`. More details are in https://docs.google.com/document/d/1Cmamx6fNfruoHLApX8tedqNVZsCEUyoBvQWpMvBsfcY/edit?tab=t.gqla6vu3231k. ### Note This diff only covers the Android version. iOS may follow after experimentation. Reviewed By: lunaleaps Differential Revision: D83783201 fbshipit-source-id: 93a7a93784d668e09d8ddacc7e30d289ccd8b7a2