Профилирование CPU мобильного приложения (Instruments/Android Profiler)

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Профилирование CPU мобильного приложения (Instruments/Android Profiler)
Сложный
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Профилирование CPU мобильного приложения (Instruments/Android Profiler)

Разработчик говорит «приложение тормозит при переходе между экранами». Это — не данные для работы. Данные — это «переход с HomeViewController на DetailViewController занимает 380 мс, из которых 240 мс уходит на viewDidLoad в DetailViewController, а в нём 200 мс — это синхронный NSJSONSerialization.jsonObject на main thread». Именно за такой точностью — к CPU-профилировщику.

Xcode Instruments: как получить реальные данные

Instruments запускается через Xcode → Product → Profile или ⌘I. Для CPU — используем Time Profiler (sampling-профилировщик, 1ms интервал по умолчанию) или CPU Profiler (instrumentation-based, точнее но с overhead).

Time Profiler — первый выбор для большинства задач. Показывает call tree с временем выполнения каждого метода. Критичные настройки:

  • Call Tree Options → Hide System Libraries — убираем шум от системных фреймворков, видим только свой код
  • Separate by Thread — понимаем, на каком потоке тормозит
  • Invert Call Tree — показывает «листья» дерева вызовов, то есть методы, где реально тратится время

Типичный сценарий: записываем 10 секунд работы приложения, открываем call tree. [MyImageProcessor processImage:] занимает 67% CPU. Раскрываем — там vImageScale_ARGB8888 вызывается на main thread из didSelectRowAt. Выносим в DispatchQueue.global(qos: .userInitiated), результат применяем через DispatchQueue.main.async — проблема решена.

Signposts и os_log для точного измерения

Системный профилировщик имеет overhead и шум. Для точного замера конкретной операции — os_signpost:

import os.signpost
let log = OSLog(subsystem: "com.app", category: "Performance")
let id = OSSignpostID(log: log)

os_signpost(.begin, log: log, name: "Image Processing", signpostID: id)
processImage(data)
os_signpost(.end, log: log, name: "Image Processing", signpostID: id)

В Instruments → Logging track видим точные временные метки. Это позволяет измерять не «где тормозит в целом», а «сколько конкретно занимает эта операция при разных входных данных».

Flame graph и где его читать

В Xcode 14+ Time Profiler показывает flame graph. Широкие горизонтальные прямоугольники — методы, потребляющие много времени. Вложенность показывает стек вызовов. Главное правило: смотреть на «плато» — широкие блоки без дочерних методов. Это «дно» стека, где реально расходуется время.

Android Studio Profiler: CPU

Android Studio CPU Profiler поддерживает три режима:

Режим Когда использовать Overhead
Sample Java/Kotlin Methods Первичная диагностика Низкий
Trace Java/Kotlin Methods Точный анализ, нужен полный стек Высокий
Sample C/C++ Functions Native код, NDK Низкий
System Trace Системные события, janky frames Минимальный

System Trace — наиболее информативный для анализа jank. Показывает Choreographer#doFrame, RenderThread, hwuiTask, binder-вызовы. Видно конкретный кадр, который задержался, и почему.

Запись через UI или программно:

Debug.startMethodTracing("myapp_trace")
// операция
Debug.stopMethodTracing()

Файл .trace открывается в Android Studio Profiler для анализа.

Типичная находка на Android

Профилирование показало: при открытии экрана чата 180 мс уходит на SharedPreferences.getAll() — разработчик загружал все настройки при каждом открытии для проверки флага. SharedPreferences на главном потоке с большим файлом (2 MB из-за кэшированных данных) — реальный блокировщик UI. Переход на DataStore с фоновым чтением через Flow убрал эту задержку полностью.

Что мы делаем в рамках услуги

  1. Записываем Instruments / Android Profiler сессии для ключевых пользовательских сценариев
  2. Анализируем call tree и flame graph, выявляем top-3 узких мест по времени CPU
  3. Добавляем os_signpost / Trace маркеры для точного измерения критичных операций
  4. Устраняем найденные проблемы: выносим на фоновые потоки, оптимизируем алгоритмы, добавляем кэш
  5. Повторное профилирование для подтверждения улучшения

Сроки

Профилирование и анализ — 1–2 дня. Устранение найденных проблем — зависит от количества и сложности: от 2 дней до 2 недель. Оцениваем после анализа.