Высокая загрузка ЦП при запуске как Debug и как Release (инструменты запускаются как Release). Как отлаживать?

#ios #swift #xcode #instruments

#iOS #swift #xcode #инструменты

Вопрос:

У меня было то, что я бы назвал проблемой производительности моего приложения при запуске на старом оборудовании (iPad mini 2, которому около 7 лет). К сожалению, это кажется спорадическим, когда 2/10 раз все работает нормально, а в остальном загрузка ЦП со временем увеличивается до 90%.

Приложение выполняет некоторые интенсивные (?). drawRect материалы, в которых я использую bezierpath для рисования диаграммы сердечного ритма (среди прочего). Использование инструментов на самом деле не показывает мне, где возникает возможное узкое место. (TBH, я не очень хорошо читаю выходные данные)

(для этого изображения я использовал ‘инвертировать дерево вызовов’, ‘скрыть системные библиотеки’ введите описание изображения здесь

Я попытался ввести собственное профилирование времени

 let start = CFAbsoluteTimeGetCurrent()
let end = CFAbsoluteTimeGetCurrent() - start
print("drawRect END:(Date()) - total Secs:(end)")
 

и хотя это медленнее, чем мой iPhone 7, я думаю, что это все еще приемлемо.

 drawRect END:2021-01-16 00:39:26  0000 - total Secs:0.002599000930786133 
drawRect END:2021-01-16 00:39:27  0000 - total Secs:0.001813054084777832
drawRect END:2021-01-16 00:39:28  0000 - total Secs:0.0019180774688720703
drawRect END:2021-01-16 00:39:29  0000 - total Secs:0.0016759634017944336 
 

В конце концов, я нашел этот пост -> https://developer.apple.com/forums/thread/19936 и когда я запустил запуск как «release», высокая загрузка процессора в основном исчезла.

Вопрос:

  1. Во время обычной разработки приложения я согласен, что запуск как Debug был бы полезен, но какова реальная выгода? Чем отличается конфигурация отладки? (Некоторые материалы для чтения / ссылки были бы хороши) TQ
  2. Если инструменты работают как конфигурация «release«, то как на самом деле можно выяснить, что происходит под капотом? Как и в моем случае, я понятия не имел, что Instruments работает как «release«, а обычный запуск (Cmd-R) выполняется как «Debug«. Это большое несоответствие и, очевидно, сбило меня с толку.
  3. Итак .. у меня проблема или нет? Весьма вероятно, что я это делаю, но я, хоть убей, не могу понять, почему.
  4. iPad Mini2 определенно старый и медленный. Я загрузил какое-то приложение для мониторинга процессора / системы из магазина и, просто запустив его, я уже вижу 40% загрузки ЦП (!!) Есть ли способ собирать данные об использовании ЦП в приложении? как в инструкции Print.

Спасибо.

Комментарии:

1. Я бы рекомендовал вам просмотреть все видеоролики WWDC об инструментах. В частности, те, в которых рассказывается о том, как использовать os_signpost для количественной оценки производительности критически важных областей вашего кода. Оттуда вы можете работать над улучшением производительности и иметь возможность проверять, действительно ли они помогают, а не ухудшают ситуацию.

Ответ №1:

  1. Преимущество конфигурации отладки в том, что она позволяет отлаживать ваше приложение. Конфигурация отладки позволяет вам видеть такие вещи, как значения переменных. Если вы попытаетесь отладить свое приложение с конфигурацией Release, вы увидите адреса памяти вместо имен переменных. Конфигурация сборки отладки жертвует скоростью для возможности отладки. Конфигурация сборки релиза жертвует отладкой ради скорости.
  2. Если вы хотите увидеть проблему, с которой вы сталкиваетесь при запуске в конфигурации отладки, отредактируйте схему вашего проекта и сообщите Xcode использовать конфигурацию отладки для профилирования. Затем инструменты могут помочь вам найти медленные места в коде в конфигурации отладки.

Xcode изменяет конфигурацию сборки

  1. Сосредоточьтесь на профилировании времени для конфигурации сборки релиза, конфигурации, которую увидят люди, использующие ваше приложение.
  2. Взгляните на ссылки на os и OSLog framework в документации Apple, которую вы можете прочитать в Xcode, выбрав Справка> Документация разработчика. Фреймворки os и OSLog находятся в разделе System. Эти фреймворки — это то, как вы собираете данные профилирования из своего кода.

Для более подробного описания инструмента Time Profiler прочитайте следующую статью:

Поиск медленных мест в вашем коде с помощью инструмента Time Profiler

Комментарии:

1. Я пытался использовать профилировщик для конфигурации выпуска, но я просто не могу понять, в чем проблема. (факт — не знаю, как)

2. Ваше приложение медленно запускается в конфигурации сборки релиза? Вы сказали, что у вас проблема, когда ваше приложение запускается в конфигурации отладки. Возможно, у вас нет проблем с конфигурацией релиза. Я обновил свой ответ ссылкой на статью об использовании инструмента Time Profiler.

3. Приложение, похоже, отлично работает в конфигурации сборки релиза. Похоже, что при запуске профилировщика времени в инструментах не возникает никаких проблем (насколько я могу судить) (см. Скриншот в исходном сообщении). Хотя загрузка ЦП (в соответствии с рисунком) показывает много пиков до 80% загрузки ЦП. (Есть ли способ заставить TimeProfiler отображать загрузку ЦП так же, как на экране в Xcode?) [и спасибо за ссылку. Я пройду через это и отлажу свое приложение и посмотрю, что я получу.)

4. График для инструмента Time Profiler предоставляет информацию, аналогичную графику использования во времени в Xcode. Я не знаю ни одного способа заставить инструменты отображать два других графика на вашем скриншоте Xcode.