У меня очень странная проблема, которая, по-видимому, вызвана компиляцией с последним Xcode 10.2.
Я заметил, что время запуска моего приложения значительно ухудшилось (в 3 раза медленнее) , вызванное просто сборка с использованием Xcode 10.2 (.x) и запуск на 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) считается 1x, остальное относительно него.Мы говорим здесь секунды (за исключением 3 с -> почти 9 с).
Эта значительная задержка происходит только при новой установке. Каждый последующий запуск снова выполняется быстро.
Последний код (Swift 5) - весь код перенесен в Swift 5, все CocoaPods обновлены до последних версий, совместимых с Swift 5, проект обновлен до настроек Xcode 10.2
Очень похожая ситуация, как и до Swift 5. ИтакСам Swift 5, похоже, не является проблемой.
Edit 1:
Time Profiler обнаружил, что время инициализации стало значительно медленнее.
Оказывается, _dyld_start
(загрузка динамических структур) медленнее ~ 35x .
| | _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::
) много упоминаний "рекурсивных" икажется, что рекурсия идет не так, как надо.Трассировка стека, кажется, идет очень неправильно (см. Скриншоты ниже).
Я думаю, что единственным обходным решением здесь будет удаление каркасов и компиляция напрямую илииспользование статических библиотек.
Любая помощь / идеи о том, как продолжать использовать фреймворки, приветствуется!Спасибо!
Редактировать 3:
Похоже, что проблема больше не возникает в первой общедоступной бета-версии iOS 13.
Измерения (настройки ниже) показали мне, что запуск одной и той же версии кода на iOS 12.3.1 занимает в 3 раза больше времени, чем на iOS 13.
Это действительно кажется мне ошибкой на iOS 12.x.Учитывая тот факт, что iOS 13 выйдет довольно скоро, я не думаю, что какое-либо исправление для iOS 12.x больше не появится (оставленные устройства, такие как iPhone 6, будут страдать ...).
Настройка теста:
- Запуск того же кода (Swift 5, Xcode 11 beta 2)
- Запуск на той же модели iPhone (iPhone 6S 16 ГБ)
- Холодный запуск приложения после перезагрузки устройства
- Устройства с iOS 12.3.1 (последняя стабильная версия) и iOS 13 (первая общедоступная бета-версия)