Instruments — что это, возможности Time Profiler и Allocations

Автор: IT Sectr Опубликовано: 2026-03-30 Время чтения: 9 мин

Instruments — это встроенный в Xcode профилировщик для анализа производительности приложений под iOS, macOS, tvOS и watchOS. Инструмент предоставляет набор шаблонов для измерения CPU, памяти, сети, графики и энергопотребления в реальном времени. По данным Apple Developer Documentation, Instruments используется на всех этапах разработки — от поиска утечек до оптимизации времени запуска приложения.

Главное

  • Instruments — профилировщик от Apple для iOS, macOS, tvOS и watchOS, встроенный в Xcode.
  • Time Profiler измеряет загрузку CPU по каждому потоку и методу с точностью до микросекунды.
  • Allocations отслеживает все аллокации памяти в реальном времени с поддержкой Heapshot.
  • Leaks автоматически находит retain cycles и утечки памяти без ручного дампа кучи.
  • Energy Log показывает влияние приложения на разряд батареи по каждому компоненту системы.

Что такое Instruments?

Instruments — это система профилирования и трассировки, входящая в состав Xcode и основанная на технологии DTrace, разработанной Sun Microsystems. Instruments объединяет десятки профилирующих инструментов (шаблонов) в едином интерфейсе: достаточно выбрать шаблон, запустить приложение через Xcode и начать сбор данных.

Архитектура Instruments построена на клиент-серверной модели: агент на устройстве собирает данные и передаёт их на Mac через USB-соединение. Это минимизирует влияние профилировщика на производительность приложения — Instruments работает преимущественно на стороне хоста. По данным WWDC 2022, оверхед Time Profiler при частоте сэмплирования 1 мс составляет менее 3%.

Instruments поддерживает кастомные шаблоны — разработчик может комбинировать несколько инструментов в одном сеансе профилирования. Например, одновременно запустить Time Profiler + Allocations + Leaks и видеть корреляцию между пиками CPU и аллокациями памяти. Это даёт целостную картину производительности, недоступную при изолированном анализе каждого компонента.

Какие шаблоны доступны по умолчанию

Xcode поставляется с 16 предустановленными шаблонами Instruments: Time Profiler, Allocations, Leaks, Energy Log, Network, Core Animation, Metal System Trace, File Activity, System Trace и другие. Каждый шаблон оптимизирован для конкретной задачи и предварительно сконфигурирован с правильными настройками триггеров и фильтров.

Time Profiler: анализ производительности CPU

Time Profiler — самый используемый шаблон Instruments. Он работает на основе сэмплирования стека вызовов: каждые 1-10 миллисекунд система записывает стек вызовов всех потоков приложения. После остановки сеанса Instruments суммирует сэмплы и показывает, какие методы и функции заняли больше всего времени. Результат представляется в виде Call Tree — дерева вызовов с сортировкой по Self Weight.

Ключевая метрика Time Profiler — Self Weight (время, проведённое непосредственно в методе, без учёта вызовов дочерних методов). Именно Self Weight показывает, какие функции реально грузят процессор. Weight (общее время с дочерними методами) может быть обманчивым: метод с высоким Weight может просто вызывать другой медленный метод, а сам быть быстрым.

swift
import UIKit

class ImageGalleryViewController: UIViewController {
    // Time Profiler покажет, что cellForItemAt имеет Self Weight = 40%
    // внутри него decodeImage занимает 35% — это узкое место

    func collectionView(
        _ collectionView: UICollectionView,
        cellForItemAt indexPath: IndexPath
    ) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(
            withReuseIdentifier: "ImageCell",
            for: indexPath
        ) as! ImageCell
        // ❌ decodeImage — узкое место (Self Weight = 35%)
        cell.imageView.image = UIImage(contentsOfFile: imagePath)
        return cell
    }
}

При анализе Time Profiler обращайте внимание на методы, выполняющиеся в com.apple.main-thread. Если на главном потоке Self Weight превышает порог в 16 мс на кадр — UI будет тормозить. Решение таких проблем — перенос декодирования изображений, расчётов layout и обработки данных из главного потока в фоновый через Grand Central Dispatch (GCD).

Как читать Call Tree в Time Profiler

Call Tree — это иерархическое представление всех вызовов методов, отсортированное по Self Weight. Самый тяжёлый метод в Call Tree — первая строка. Раскрывая строку, вы видите, какие дочерние методы вызывал этот метод и сколько времени они заняли. Ищите методы, где Self Weight (собственное время) значительно превышает Weight (общее время) — это признаки синхронных блокировок и ожидания.

Allocations: отслеживание памяти в реальном времени

Allocations — это инструмент для мониторинга всех аллокаций памяти приложения. Он показывает, какие объекты, в каком количестве и с каким общим размером создаются в каждый момент времени. В отличие от Memory Profiler в Android Studio, Allocations поддерживает Heapshot — моментальный снимок живых объектов с возможностью сравнения двух снимков.

Интерфейс Allocations состоит из двух основных секций: All Allocations (суммарная статистика по всем типам объектов) и Call Trees (дерево вызовов с разбивкой по методам, которые создают объекты). Для поиска утечек используйте Heapshot Analysis: сделайте снимок до выполнения сценария, выполните сценарий, сделайте снимок после — и сравните, какие новые объекты остались в памяти.

По данным Apple Developer Documentation, наиболее частый паттерн утечки, обнаруживаемый через Allocations — избыточное создание UIView и CALayer при скролле коллекций. Если при каждом скролле количество живых UIView растёт, а коллекция переиспользует ячейки — где-то создаются дополнительные view без освобождения старых. Allocations показывает точный стек вызовов, где эти view создаются.

ПараметрDescriptionНа что смотреть
# LivingКоличество живых объектов данного типаДолжно быть стабильным при повторении сценария
# TransientОбъекты, созданные и освобождённые за периодРезкие всплески — признак избыточных аллокаций
Total BytesСуммарный объём памяти данного типаСравнивайте с общей доступной RAM устройства

Heapshot Analysis: сравнение снимков памяти

Heapshot — это моментальный снимок живых объектов в Allocations. Сделайте Heapshot до выполнения сценария, выполните сценарий и сделайте второй Heapshot. Разница между снимками покажет, какие объекты были созданы и не освобождены. Идеальный результат — рост только временных объектов (Autorelease pool). Для точного анализа используйте комбинацию Allocations + Leaks в одном сеансе. Allocations показывает, какие объекты не освобождаются, а Leaks — почему (какая сильная ссылка их удерживает). Запускайте двойной сеанс при каждом подозрении на утечку.

Leaks: автоматический поиск утечек памяти

Leaks — это узкоспециализированный инструмент для обнаружения утечек памяти в приложениях под iOS и macOS. В отличие от Allocations, который просто показывает аллокации, Leaks активно сканирует кучу в поисках retain cycles — ситуаций, когда два или более объекта взаимно удерживают друг друга сильными ссылками.

Leaks работает в связке с Cycles & Roots — визуализатором графа удержания объектов. Когда утечка обнаружена, Leaks показывает все объекты в цикле, их retain count и точные поля, через которые ссылки передаются. Разработчику достаточно посмотреть на граф и понять, какую ссылку нужно заменить на weak.

Инструмент автоматически подсвечивает утечки красным маркером на временной шкале. При этом Leaks работает в реальном времени: как только система обнаруживает утечку, она сразу сигнализирует разработчику. Это позволяет исправлять проблемы «на месте», не дожидаясь дампа и пост-анализа.

По данным WWDC 2022, Leaks способен обнаруживать даже сложные многоуровневые retain cycles — например, когда три и более объекта образуют замкнутую цепочку сильных ссылок. Для диагностики таких циклов граф Cycles & Roots незаменим: он наглядно показывает, как объекты замыкаются друг на друга.

Как читать граф Cycles & Roots

Каждый узел графа — это объект, каждая стрелка — сильная ссылка. Цикл — это замкнутый контур из стрелок. Цвет узла показывает статус: красный — утёкший объект, зелёный — корень (GC Root), серый — промежуточный объект. Чтобы исправить утечку, найдите стрелку, которую можно сделать weak без нарушения логики — и замените тип ссылки в коде.

Energy Log: анализ энергопотребления

Energy Log — это шаблон Instruments для измерения энергопотребления приложения. Он собирает данные с аппаратных датчиков устройства: загрузка CPU, состояние Wi-Fi и сотового радио, использование GPS, дисплей и Bluetooth. Energy Log показывает, какие операции в приложении вызывают наибольший расход батареи, и накладывает их на график энергопотребления по шкале времени.

Инструмент классифицирует операции по уровню энергозатрат: низкий (обычная работа процессора), средний (Wi-Fi передача), высокий (GPS, мобильная сеть, GPU). Если Energy Log показывает красные индикаторы высокого уровня на протяжении длительного времени — приложение разряжает батарею в фоне и будет удалено пользователем.

Типичные проблемы, выявляемые Energy Log: WakeLock без ограничения времени (приложение держит процессор активным после завершения задачи), Location Updates с высокой точностью в фоне (каждые несколько секунд запрос координат), аномалии сетевых сессий(частые переподключения к серверу). Energy Log рекомендует фиксировать любой такой инцидент и добавлять условие для отключения энергоёмкой операции.

Для тестирования энергопотребления используйте реальное устройство на батарейном питании — на эмуляторе показатели энергопотребления некорректны. Запускайте Energy Log вместе с UI-тестами для автоматизации проверки расхода батареи в CI.

Как запустить и интерпретировать результаты Instruments

Запуск Instruments выполняется из Xcode двумя способами: через меню Product → Profile (⌘I) или через открытие Instruments как отдельного приложения в Launchpad. Первый способ удобнее: Xcode автоматически собирает приложение в профилировочном режиме и запускает его на подключённом устройстве с выбранным шаблоном. После остановки сеанса Instruments сохраняет трассировку в файл с расширением .trace.

Интерпретация результатов зависит от шаблона. Для Time Profiler смотрите на Call Tree, отсортированный по Self Weight — самые верхние методы — ваши основные узкие места. Для Allocations — на # Living после циклического сценария: если количество объектов выросло — ищите утечку. Для Leaks — на красные маркеры и граф Cycles & Roots. Сравнивайте результаты до и после оптимизации — это единственный способ подтвердить эффективность изменений.

swift
// Командная строка для Instruments в CI
// Интеграция Instruments в CI/CD pipeline
import XCTest

class PerformanceTests: XCTestCase {
    func testScrollPerformance() {
        // Замеряем время скролла коллекции
        measure(metrics: [XCTCPUMetric(), XCTMemoryMetric()]) {
            app.scrollToBottom()
        }
    }
}

В CI можно запускать Instruments из командной строки через xcodebuild -showBuildSettings и xcrun xctrace. Это позволяет автоматизировать профилирование при каждом commit и не пропустить регрессию. Для анализа используйте Baseline-сравнение: если метрика ухудшилась на 5% относительно предыдущего коммита — пайплайн должен остановиться.

Основные ошибки при работе с Instruments: профилирование на симуляторе вместо устройства (данные CPU и GPU некорректны), сбор данных без сценария (результаты случайны), игнорирование Call Tree (смотреть только на график, а не на конкретные методы). Исправление этих ошибок даёт 80% качества профилирования.

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

Можно ли использовать Instruments для SwiftUI приложений?

Да, Instruments полностью поддерживает SwiftUI. Для анализа UI-производительности используйте шаблон Core Animation — он показывает скорость отрисовки кадров и выявляет лишние перерисовки View. Time Profiler и Allocations также работают со SwiftUI без ограничений.

Чем Instruments отличается от Shark (внутреннего анализатора LeakCanary)?

Instruments — это универсальный профилировщик для всей экосистемы Apple, покрывающий CPU, память, сеть, графику и энергопотребление. Shark — это внутренний анализатор heap dump в LeakCanary, который специализируется исключительно на поиске утечек памяти на Android.

Нужно ли удалять Instruments из приложения перед релизом?

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

Какой оверхед у Time Profiler?

При стандартной частоте сэмплирования 1 мс оверхед Time Profiler составляет менее 3%. В режиме точной трассировки (каждый вызов функции) оверхед может достигать 20–30%, поэтому для повседневного профилирования используется сэмплирование. Точная трассировка нужна только для критических участков.

Как экспортировать результаты Instruments?

Результаты автоматически сохраняются в файл .trace в папке проекта. Файл можно открыть на другом Mac с Xcode для совместного анализа. Для экспорта в текстовый формат используйте xcrun xctrace export --input file.trace --output result.xml.

Итоги

  • Instruments — встроенный в Xcode профилировщик Apple с набором шаблонов для всех аспектов производительности.
  • Time Profiler находит узкие места CPU через сэмплирование стека вызовов — главный инструмент оптимизации.
  • Allocations отслеживает аллокации памяти в реальном времени с поддержкой Heapshot Analysis.
  • Leaks автоматически обнаруживает retain cycles и визуализирует граф удержания объектов.
  • Energy Log измеряет влияние приложения на батарею, классифицируя операции по уровню энергозатрат.
  • Запускайте профилирование на реальном устройстве, используйте сценарии и обязательно сравнивайте с baseline.
  • Интеграция Instruments в CI через XCTest и xcrun xctrace предотвращает регрессию производительности.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также