Connect with us

Разработка

Time Profiler в Xcode Instruments: повышение производительности с помощью ИИ

Time Profiler в Xcode Instruments может стать отличным способом оптимизации кода с помощью агентов искусственного интеллекта.

Опубликовано

/

     
     

Искусственный интеллект с его агентами меняет подход к разработке, и вы можете подумать, что Xcode Instruments больше не нужны для итераций по оптимизации производительности. Когда я начинал разрабатывать приложения в 2009 году, мы постоянно использовали Time Profiler и другие инструменты Xcode Instruments для анализа и улучшения производительности наших приложений. Устройства были намного медленнее, поэтому, если этого не делать, приложения переставали работать из-за чрезмерного использования памяти.

Сегодня у нас невероятно быстрые устройства. Это кажется излишним, и это правда: потребность в профилировании снизилась. Однако я искренне верю, что мы можем значительно улучшить и повысить производительность наших приложений, если будем регулярно обращаться к Xcode Instruments. Хорошая новость в том, что вам больше не нужно проводить анализ самостоятельно: в этом могут помочь ИИ-агенты.

Пример: ускорение извлечения элементов доступности в 25 раз

Time Profiler в Xcode Instruments: повышение производительности с помощью ИИ

Используя Time Profiler и ИИ агентов, мне удалось ускорить загрузку элементов доступности в RocketSim в 25 раз

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

RocketSim CLI позволяет агентам загружать элементы доступности из Симулятора. Агенты используют их для автономной навигации по приложению в симуляторе. Когда я начал улучшать производительность, у меня было две проблемы:

  • Отсутствовали элементы доступности (например, элементы таббара)
  • Загрузка элементов была ужасно медленной

Как только я исправил первую проблему, загрузка стала еще медленнее. Извлечение данных на экране с более чем 70 элементами заняло примерно 12,18 секунд. Если агенту придётся перемещаться по симулятору, тратя по 12 секунд на каждый шаг, это будет пустой тратой времени.

Я не буду вдаваться в подробности изменений, внесённых для улучшения кода, поскольку это не будет применимо к вашему приложению. Могу лишь сказать, что я использовал Xcode Instruments, чтобы дать ИИ возможность глубоко проанализировать код и определить, где его нужно улучшить.

В целом, улучшение показателей по фазам выглядит следующим образом:

  • Фаза 1: 12 с → 4 с (в 3 раза)
  • Фаза 2: 4 с → 2,5 с (в 5 раз)
  • Фаза 3: 2,5 с → 525 мс (в 23 раза)
  • Фаза 4: 525 мс → 485 мс (в 25 раз)

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

Добавление CLI в ваше приложение

Прежде чем мы перейдем к тому, как я использую Xcode Instruments и его Time Profiler для предоставления ИИ информации о производительности приложения, я сначала хочу порекомендовать добавить CLI в ваше приложение. Не для использования в производственной среде, а для того, чтобы ваши агенты могли легко проверять улучшения.

Я добавил RocketSim CLI для производственной среды, не понимая, что это также значительно улучшило мой рабочий процесс разработки. Я мог внезапно попросить своих агентов улучшить производительность функций RocketSim, сделав те же функции доступными в CLI. Агент применяет улучшения, запускает CLI и сравнивает результат.

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

Использование Xcode Instruments с агентами

Важно знать, что существует альтернатива CLI для Xcode Instruments:

avanderlee@AJs-MacBook-Pro ~ % xctrace help
usage:
	xctrace <command> [options]

global options:
	-q, --quiet

commands:
	record                                      Perform new recording using specified template
	import                                      Import file of a supported format into .trace file
	export                                      Export .trace file content to an external format
	remodel                                     Remodel .trace using currently installed modelers
	symbolicate                                 Symbolicate .trace file using specified dSYM
	list [devices|templates|instruments]        List capabilities of the current running environment
	version                                     Print version of the tool

further help:
	 xctrace help <command>

В настоящее время я работаю над эффективным способом избежать траты всех ваших токенов на чтение файлов xctrace. Но даже если это получится, ручное использование Xcode Instruments может показаться более удобным, если вы к этому привыкли.

Мой рабочий процесс выглядел следующим образом:

  • Применить улучшения производительности к агентам
  • Перезапустить приложение в Xcode Instruments с шаблоном Time Profiler и дополнительным инструментом signpost

Последний позволяет получать более детализированные инсайты по вашим агентам. Добавляя signpost’ы, вы делаете свой код видимым в инструменте signpost:

Time Profiler в Xcode Instruments: повышение производительности с помощью ИИ

Попросите ваших агентов добавить signpost’ы в код, который вы оптимизируете, чтобы повысить его наблюдаемость

Разумеется, вы можете поручить добавление этих signpost’ов тому же самому агенту.

На изображении выше видно, что я выполнял запуск несколько раз. Эти прогоны соответствуют различным фазам, о которых я упоминал ранее. Четыре синих пика на графике signpost отражают четыре использования accessibility overlay в RocketSim для получения элементов.

После этого я собирал данные для агента:

  • Переключился с List: Metadata на List: Intervals, выделил все строки и скопировал их в буфер обмена
  • Затем выбрал инструмент Time Profiler за тот же временной диапазон и сделал deep copy корневого элемента

Последний выглядит следующим образом:

Time Profiler в Xcode Instruments: повышение производительности с помощью ИИ

Сделайте deep copy результатов Time Profiler в Xcode Instruments, чтобы передать их вашим агентам

Обратите внимание, что я использовал фильтры Call Tree внизу окна, чтобы:

  • разделить потоки
  • скрыть системные библиотеки

Так вы сокращаете вывод и оставляете только действительно важное.

Создание промпта

Объединив оба вывода, можно составить результирующий промпт. Я использовал что-то в таком духе:

I tested the functionality 4 times. Here are the signpost intervals:

<signpost_intervals>

And here are the Time Profiler insights:

<time_profiler_deep_copy>

Analyze and create a new plan for further optimizations.

Этого будет достаточно, чтобы агент проанализировал результаты и предложил следующий этап улучшений.

Учитывайте использование токенов

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

В то же время, raw вывод deep copy можно значительно оптимизировать. Он выглядит примерно так:

Weight	   Self Weight	Symbol     Names
2.02 s     100,0%	0 s	   RocketSim (13637)
642.00 ms  31,9%	0 s	   RocketSim (0x2daf767)
635.00 ms  31,5%	0 s	   partial apply for closure #1 in AccessibilityElementsCoalescer.accessibilityElements(deviceUDID:)
635.00 ms  31,5%	0 s	   closure #1 in AccessibilityElementsCoalescer.accessibilityElements(deviceUDID:)
635.00 ms  31,5%	0 s	   protocol witness for AccessibilityElementsFetchProvider.fetch(deviceUDID:) in conformance SharedSimulatorAccessibilityFetchProvider

Хотя результат неплох, его определенно можно значительно оптимизировать. Именно поэтому я работаю над новой командой CLI для RocketSim, с помощью которой вы можете запустить трассировку производительности, выполнить воспроизведение проблемы в симуляторе вручную или автоматически, а затем остановить трассировку производительности, чтобы получить вышеуказанные результаты в оптимизированном формате. Если вы хотите быть в курсе этого прогресса, я настоятельно рекомендую подписаться на рассылку RocketSim, используя форму на rocketsim.app.

Итерация и улучшение

Вышеописанный цикл повторялся для каждой фазы оптимизации. В конце концов, производительность стала достаточно хорошей, чтобы прекратить рассмотрение следующей итерации. Агент, вероятно, тоже вам скажет: нет способа сделать ваш код быстрее, чем сейчас.

Заключение

Time Profiler в Xcode Instruments может стать отличным способом оптимизации кода с помощью агентов искусственного интеллекта. Создав план оптимизации производительности на основе запроса на глубокое копирование кода, ваш агент сможет связать код проекта с реальными данными о производительности и соответствующим образом улучшить его. Повторение этого процесса может привести к значительному повышению производительности.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: