Медленное iOS-приложение запускается с использованием Xcode 10.2 + iOS 12.2 - PullRequest
4 голосов
/ 22 мая 2019

У меня очень странная проблема, которая, по-видимому, вызвана компиляцией с последним 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::) много упоминаний "рекурсивных" икажется, что рекурсия идет не так, как надо.Трассировка стека, кажется, идет очень неправильно (см. Скриншоты ниже).

Profiler stacktrace screenshots

Я думаю, что единственным обходным решением здесь будет удаление каркасов и компиляция напрямую илииспользование статических библиотек.

Любая помощь / идеи о том, как продолжать использовать фреймворки, приветствуется!Спасибо!


Редактировать 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 (первая общедоступная бета-версия)
...