Рекомпозиция и производительность Compose
Вопрос
Объясни, как работает рекомпозиция в Compose и как ты боролся с лишними рекомпозициями.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Рекомпозиция вызывается изменением прочитанного State
Skipping: стабильные и равные параметры позволяют пропустить функцию
Стабильность: неизменяемые классы, ImmutableList, @Immutable
Чтение быстро меняющегося состояния в фазе layout или draw через лямбды модификаторов
derivedStateOf и remember для вычислений, key в списках
Диагностика: Layout Inspector, отчёты компилятора, проверка в release
Что могут спросить следом
- Что изменил Strong Skipping?
- Почему debug-сборка Compose медленнее?
Разбор
Compose следит, какие State прочитала каждая composable. Когда значение меняется, рантайм повторно вызывает только эти функции, а при вызове детей сравнивает параметры: если все стабильны и равны прошлым, ребёнок пропускается. Поэтому производительность упирается в стабильность и в то, где читается состояние. Я делаю UI-модели неизменяемыми data class с val, списки передаю как ImmutableList или помечаю обёртки @Immutable, не создаю новые объекты в теле на каждой рекомпозиции. Быстро меняющиеся значения вроде скролла и анимаций читаю в лямбдах Modifier.offset { } или graphicsLayer { }, тогда меняется только layout или отрисовка без рекомпозиции. Для значений, которые меняются реже источника, использую derivedStateOf, а в LazyColumn всегда задаю key. Ищу проблемы Layout Inspector со счётчиками рекомпозиций и отчётами компилятора, а меряю в release-сборке, потому что debug Compose заметно медленнее. Со Strong Skipping стало проще, но новые ссылки всё равно ломают пропуск.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.