Ответ вслух Senior Производительность и тестирование обновлено

Как ускорить холодный старт iOS-приложения

Вопрос

Холодный старт приложения 3 секунды. Как будете ускорять?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала измеряю: шаблон App Launch в Instruments на старом устройстве и метрики MetricKit от реальных пользователей. Делю запуск на две части.

Что должно прозвучать в ответе

  • Измерить: App Launch в Instruments, MetricKit и Organizer, разделить pre-main и после

  • Pre-main: меньше динамических фреймворков, статическая линковка, без тяжёлых `+load` и статических инициализаторов

  • До первого кадра только нужное первому экрану, SDK лениво

  • Первый экран из кеша, сеть асинхронно

  • Не блокировать главный поток: миграции, диск, декодирование в фоне

  • Регрессии ловить метрикой в CI или на реальных данных

Что могут спросить следом

  • Что делает dyld до main?
  • Чем тёплый старт отличается от холодного?

Разбор

Сначала измеряю: шаблон App Launch в Instruments на старом устройстве и метрики MetricKit от реальных пользователей. Делю запуск на две части. До main работает загрузчик: каждая динамическая библиотека стоит времени, поэтому собираю зависимости статически и убираю лишние фреймворки, проверяю тяжёлые статические инициализаторы. После main смотрю, что синхронно выполняется в didFinishLaunching и до первого кадра: обычно это инициализация десятка SDK, миграции базы, чтение больших файлов. Оставляю только нужное первому экрану, остальное откладываю. Первый экран показываю из кеша, а свежие данные подтягиваю асинхронно. И закрепляю результат: метрика времени запуска в Organizer и алерт на регрессию.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.