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

Разработчик говорит: «приложение тормозит при переходе между экранами». Это — не данные для работы. Профилирование CPU мобильного приложения с помощью Instruments и Android Profiler даёт точные данные вместо догадок. Каждый второй проект, который попадает к нам на аудит, имеет проблемы с производите

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

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

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

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

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

Часто задаваемые вопросы

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Разработчик говорит: «приложение тормозит при переходе между экранами». Это — не данные для работы. Профилирование CPU мобильного приложения с помощью Instruments и Android Profiler даёт точные данные вместо догадок. Каждый второй проект, который попадает к нам на аудит, имеет проблемы с производительностью CPU на главном потоке. В среднем находим 5–7 узких мест на 1000 строк кода. Типичная картина: 80% времени тратится на 20% методов — закон Парето в действии. Без профилирования найти эти 20% практически невозможно. Данные — это «переход с HomeViewController на DetailViewController занимает 380 мс, из которых 240 мс уходит на viewDidLoad в DetailViewController, а в нём 200 мс — это синхронный NSJSONSerialization.jsonObject на main thread». Именно за такой точностью — к CPU-профилировщику. Без него 80% «оптимизаций» не приносят результата.

Почему CPU-профилирование — первый шаг к быстрому приложению?

Instruments запускается через Xcode → Product → Profile или ⌘I. Для CPU используем Time Profiler (sampling-профилировщик, 1 мс интервал по умолчанию) или CPU Profiler (instrumentation-based, точнее, но с overhead до 30%). Sampling-режим эффективнее для первичной диагностики: overhead ниже и call tree легче читать.

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

  • 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 — проблема решена. Время выполнения операции сокращается в 3-4 раза, а скорость скролла восстанавливается.

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 видим точные временные метки. Это позволяет измерять не «где тормозит в целом», а «сколько конкретно занимает эта операция при разных входных данных». Добавление signpost-разметки окупается при каждом последующем профилировании.

Как читать flame graph?

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

Android Studio Profiler: CPU

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

Режим Когда использовать Overhead
Sample Java/Kotlin Methods Первичная диагностика Низкий (1-5%)
Trace Java/Kotlin Methods Точный анализ, нужен полный стек Высокий (до 30%)
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 убрал эту задержку полностью. Экономия времени — 180 мс на каждом открытии.

Частые проблемы на iOS

Синхронный NSJSONSerialization на main thread, загрузка изображений без кэша в UITableViewCell, избыточные вызовы setNeedsDisplay — эти 3 паттерна встречаются в 70% iOS-проектов с проблемами отзывчивости. Устранение первых 2 даёт прирост FPS с 30 до 60 без архитектурных изменений.

Как мы проводим профилирование: этапы

  1. Аналитика — определяем ключевые пользовательские сценарии (скролл ленты, открытие экрана, загрузка контента).
  2. Проектирование замера — добавляем os_signpost / Trace.beginSection для критичных операций.
  3. Реализация — запись сессий под нагрузкой (реальный девайс, боевая сборка).
  4. Тест — разбор call tree и flame graph, фиксация top-3 проблем.
  5. Деплой — передача отчёта и кода с исправлениями.

Сравнение инструментов:

Параметр Instruments (iOS) Android Profiler
Метод сбора Sampling / Instrumentation Sampling / Trace
Просмотр стека Call Tree + Flame Graph Flame Chart + Top Down
Overhead на запись 1-5% (sampling) 1-10% (sampling)
Точность до 1 мс (sampling) 0.1 мс (trace)

Документация Google Developers уточняет, что System Trace наиболее точен для jank.

Что входит в работу

  • Подготовка скриптов для автоматического запуска профилирования (UI automation + Benchmark режим).
  • Первичная запись сессий (10-15 мин активного использования приложения).
  • Формирование PDF-отчёта с call tree, flame graph и аннотированными скриншотами.
  • Рекомендации по исправлению с примером кода (на Swift/Kotlin).
  • Повторное профилирование после изменений для подтверждения результата.

Сроки: профилирование и анализ — от 1 до 2 дней. Устранение проблем — от 2 дней до 2 недель в зависимости от сложности. Стоимость аудита с отчётом — от 15 000 ₽, устранение выявленных проблем — от 30 000 ₽. Оцениваем проект бесплатно после ознакомления с кодом. Гарантируем снижение загрузки CPU на главном потоке минимум на 30%.

Более 50 проектов по оптимизации производительности и 7 лет опыта в мобильной разработке — наши инженеры знают, как найти и устранить узкие места.

Получите консультацию по оптимизации CPU вашего приложения — свяжитесь с нами. Закажите профилирование и получите отчёт с конкретными рекомендациями.