Фазы запуска приложения
- System Interface - загрузка исполняемого файла
- Runtime Setup - настройка Objective-C/Swift runtime
- UIKit Init - инициализация UIKit
- Application Init - вызов
UIApplicationMain
- Initial Frame Render - первый рендер интерфейса
Ключевые методы оптимизации
1. Уменьшение динамических библиотек
Каждая динамическая библиотека добавляет ```15-400ms к времени запуска:
// В Podfile:
dynamic_frameworks = ['Alamofire', 'SnapKit'] // Плохо
static_frameworks = ['Alamofire', 'SnapKit'] // Лучше
2. Оптимизация +load и +initialize
Замените устаревшие методы:
// Устаревший подход:
+ (void)load {
// Медленно
}
// Современная альтернатива:
__attribute__((constructor)) static void constructor() {
// Быстрее
}
3. Отложенная инициализация сервисов
Используйте lazy-инициализацию:
lazy var analyticsService: AnalyticsService = {
return AnalyticsService(config: config)
}()
4. Оптимизация AppDelegate
- Перенесите тяжелые операции после первого рендера
- Используйте фоновые очереди для нетривиальных задач
5. Pre-main время
Анализируйте с помощью:
DYLD_PRINT_STATISTICS=1 /path/to/your/app.app/app
Оптимизации:
- Уменьшайте количество классов
- Убирайте неиспользуемые Objective-C категории
6. Оптимизация Storyboard/XIB
- Разбивайте большие Storyboard на части
- Используйте код для часто изменяемых UI компонентов
7. Холодный vs горячий старт
Холодный старт (Cold Launch):
- Удаление неиспользуемых ресурсов
- Оптимизация размеров ассетов
Горячий старт (Warm Launch):
- Кэширование данных между сеансами
- Сохранение состояния UI
Инструменты измерения
- Xcode Organizer - метрики из App Store
- Instruments → App Launch template
- Custom метрики:
let startTime = CACurrentMediaTime()
// ...
let launchTime = CACurrentMediaTime() - startTime
Продвинутые техники
- Prefetching данных - начинайте загрузку до отображения UI
- Priority inversion - правильное распределение QoS классов
- Binary layout оптимизация - порядок символов в бинарнике
Резюмируем:
оптимизация запуска требует комплексного подхода от уменьшения системных накладных расходов до грамотной архитектуры инициализации. Начинайте с измерения текущих показателей, фокусируйтесь на pre-main времени и тяжелых зависимостях, затем переходите к оптимизации UI-рендеринга. Регулярный профилинг обязателен после значительных изменений архитектуры.