Медленное iOS-приложение запускается с использованием Xcode 10.2 + iOS 12.2
У меня есть очень странная проблема, по-видимому, вызванная компиляцией с последней версией Xcode 10.2.
Я заметил, что время запуска моего приложения значительно ухудшилось (в 3 раза медленнее), вызванное просто сборкой с использованием Xcode 10.2 и работой на iOS 12.2. Та же ревизия кода, при запуске на более старой iOS (12.0) или скомпилированной с Xcode 10.1 для iOS 12.2, работает нормально.
Задержка происходит еще до main()
вызывается. В основном задержка между консолью Bootstrapping com.myapp.something with intent foreground-interactive
а также main()
называется, где происходит увеличение времени начала измерения.
Настройка приложения (быстро):
- Смешанная цель Swift + Obj-C
- Использование внутренних структур для разделения кода
- Использование CocoaPods (1.5.3) с фреймворками
- ~35 внутренних фреймворков, загруженных во время выполнения (внутренние + в основном CocoaPods)
Вот что происходит
Ревизия старого кода (Swift 4.2) - один из старых выпусков, который хорошо работал тогда, скомпилированный с использованием Xcode 10.1
Это таблица, показывающая влияние компиляции с Xcode 10.2 на время запуска приложения (момент начала исчезновения первого кадра строки состояния).
| | iOS 12.0 | iOS 12.2 |
|------------|----------|----------|
| Xcode 10.1 | 1x | 1.25x |
| Xcode 10.2 | 1x | 3x | <--
Время запуска последней версии OK (iOS 12.0 / Xcode 10.1) считается 1х, остальное относительно него. Мы говорим здесь секунды (меньше 3 с -> почти 9 с).
Эта значительная задержка происходит только при новой установке. Каждый последующий запуск снова быстрый.
Последний код (Swift 5) - весь код перенесен в Swift 5, все CocoaPods обновлены до последних версий, совместимых с Swift 5, проект обновлен до настроек Xcode 10.2
Очень похожая ситуация, как и до Swift 5. Так что сам Swift 5, похоже, не является проблемой.
Изменить 1:
Time Profiler обнаружил, что время инициализации стало значительно медленнее.
Оказывается _dyld_start
(загрузка динамических фреймворков) примерно в 35 раз медленнее.
| | _dyld_start time |
|------------|------------------|
| Xcode 10.1 | 0.2s |
| Xcode 10.2 | 7.0s |
Это означает, что что-то связанное с Xcode 10.2 + iOS 12.2 приводит к тому, что загрузка динамических фреймворков становится значительно медленнее.
С моими ~35 динамическими фреймворками, загруженными во время выполнения (в основном это CocoaPods), ухудшение производительности кажется огромным. Понятия не имею, почему изменение хотя...
Поскольку проблема возникает только на iOS 12.2 + Xcode 10.2 (которая поддерживает Swift 5), мне было интересно, может ли эта проблема быть как-то связана со стабильностью ABI или чем-то еще. Что не имеет смысла для меня, так это то, что это происходит даже для кода до миграции Swift 5 при компиляции с Xcode 10.2.
Что я уже пробовал:
- Обновление до последней версии CocoaPods 1.7.0.rc.2 - без последствий
- Измерение с помощью Time Profiler
Изменить 2:
Кажется, это вызвано динамическим компоновщиком. Мы провели некоторое исследование и связали, похоже, использует другую реализацию на iOS 12.2 при загрузке фреймворков.
Начиная с iOS 12.2, в инструментах при загрузке (в ImageLoader::
) и кажется, что рекурсия идет не так, как надо. Трассировка стека кажется очень неправильной (см. Скриншоты ниже).
Я полагаю, что единственным обходным решением здесь было бы удаление фреймворков и компиляция напрямую или использование статических библиотек.
Любая помощь / идеи о том, как продолжать использовать рамки приветствуются! Спасибо!