Skip to content

perf(grid): keep selection, focus and stats out of the ResultsTab rebuild (#885) - #974

Merged
ZhuchkaTriplesix merged 1 commit into
devfrom
issue/885-grid-selection-stats-decoupled
Sep 25, 2026
Merged

ZhuchkaTriplesix merged 1 commit into
devfrom
issue/885-grid-selection-stats-decoupled

Conversation

@ZhuchkaTriplesix

Copy link
Copy Markdown
Member

Описание изменений

  • ResultsTab больше не вызывает setState из onRowSelected, onSelectionValuesChanged и onCellFocused. Выбранная строка, фокусная ячейка и статистика выделения вынесены в ValueNotifier, а DataGridStagingToolbar, панель значения (DataGridValuePanel) и DataGridCalcBar слушают их через ValueListenableBuilder. Шаг выделения перестраивает только эти виджеты, а не всю вкладку и сетку.
  • Агрегаты выделения считаются после паузы 60 мс (kSelectionStatsDebounce), а не на каждом шаге стрелок или перетаскивания. Пустое выделение сбрасывает статистику сразу.
  • Порядковый номер _statsSeq отбрасывает результаты устаревших расчётов: раньше медленный изолят для большого выделения мог перезаписать статистику более нового выделения.
  • В бенчмарк добавлен режим MODE=select (выделение перетаскиванием мыши через ResultsTab, вместе со статистикой).

Замеры (profile, окно 2056×2616 px, 5000×120, выделение меняется почти каждый кадр)

build p50 / p90 кадров build > 8,33 мс кадров за 6 с
до 4,34 / 6,17 мс 12 / 315 315
после 3,33 / 4,24 мс 8 / 367 367

Эффект умеренный (build p50 −23%, p90 −31%): остаток около 3 мс это перестройка самой сетки (строки в диапазоне выделения). Растр не менялся (около 4 мс).

Тесты

results_tab_test (3 новых): шаг выделения не пересоздаёт виджет сетки, то есть вкладка не перестраивается (тест падает на старом коде); статистика появляется только после паузы; сброс выделения и dispose с таймером не дают ошибок. Весь каталог test/features/workspace (256 тестов) прогнал локально, все проходят.

Не входит

  • Сама аллокация списка значений в _notifySelectionAndFocus (осталась на шаге выделения, счёт отложен).
  • Асинхронные воркеры для агрегатов, как в issue (computeAdaptive уже есть).

Связанные Issue

Closes #885

…uild (Closes #885)

ResultsTab called setState from onRowSelected, onSelectionValuesChanged and
onCellFocused, so every selection step rebuilt the whole tab (toolbar, status
line, value panel and the grid) and recomputed aggregates synchronously.

- Selected row, focused cell and selection stats live in ValueNotifiers; the
  staging toolbar, the value inspector panel and the calc bar listen through
  ValueListenableBuilders, so a step no longer rebuilds the tab or the grid.
- Aggregates are recomputed after a 60 ms pause instead of on every step, and a
  sequence number drops results from superseded selections (an older isolate
  result could previously overwrite a newer one). Clearing the selection resets
  stats immediately.
- Extend benchmark/grid_perf_bench.dart with a mouse-drag selection mode.
@github-actions github-actions Bot added frontend Theme parser epic label: frontend performance Theme parser epic label: performance ui User interface components and widgets data-grid Interactive data grid, cell editor, filtering, groupings labels Sep 25, 2026
@github-actions github-actions Bot added this to the 0.4.18 milestone Sep 25, 2026
@ZhuchkaTriplesix
ZhuchkaTriplesix merged commit 165e4b9 into dev Sep 25, 2026
4 checks passed
@ZhuchkaTriplesix
ZhuchkaTriplesix deleted the issue/885-grid-selection-stats-decoupled branch September 28, 2026 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

data-grid Interactive data grid, cell editor, filtering, groupings frontend Theme parser epic label: frontend performance Theme parser epic label: performance ui User interface components and widgets

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant