Instruments — это встроенный в Xcode профилировщик для анализа производительности приложений под iOS, macOS, tvOS и watchOS. Инструмент предоставляет набор шаблонов для измерения CPU, памяти, сети, графики и энергопотребления в реальном времени. По данным Apple Developer Documentation, 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 — самый используемый шаблон Instruments. Он работает на основе сэмплирования стека вызовов: каждые 1-10 миллисекунд система записывает стек вызовов всех потоков приложения. После остановки сеанса Instruments суммирует сэмплы и показывает, какие методы и функции заняли больше всего времени. Результат представляется в виде Call Tree — дерева вызовов с сортировкой по Self Weight.
Ключевая метрика Time Profiler — Self Weight (время, проведённое непосредственно в методе, без учёта вызовов дочерних методов). Именно Self Weight показывает, какие функции реально грузят процессор. Weight (общее время с дочерними методами) может быть обманчивым: метод с высоким Weight может просто вызывать другой медленный метод, а сам быть быстрым.
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 — это иерархическое представление всех вызовов методов, отсортированное по Self Weight. Самый тяжёлый метод в Call Tree — первая строка. Раскрывая строку, вы видите, какие дочерние методы вызывал этот метод и сколько времени они заняли. Ищите методы, где Self Weight (собственное время) значительно превышает Weight (общее время) — это признаки синхронных блокировок и ожидания.
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 — это моментальный снимок живых объектов в Allocations. Сделайте Heapshot до выполнения сценария, выполните сценарий и сделайте второй Heapshot. Разница между снимками покажет, какие объекты были созданы и не освобождены. Идеальный результат — рост только временных объектов (Autorelease pool). Для точного анализа используйте комбинацию Allocations + Leaks в одном сеансе. Allocations показывает, какие объекты не освобождаются, а Leaks — почему (какая сильная ссылка их удерживает). Запускайте двойной сеанс при каждом подозрении на утечку.
Leaks — это узкоспециализированный инструмент для обнаружения утечек памяти в приложениях под iOS и macOS. В отличие от Allocations, который просто показывает аллокации, Leaks активно сканирует кучу в поисках retain cycles — ситуаций, когда два или более объекта взаимно удерживают друг друга сильными ссылками.
Leaks работает в связке с Cycles & Roots — визуализатором графа удержания объектов. Когда утечка обнаружена, Leaks показывает все объекты в цикле, их retain count и точные поля, через которые ссылки передаются. Разработчику достаточно посмотреть на граф и понять, какую ссылку нужно заменить на weak.
Инструмент автоматически подсвечивает утечки красным маркером на временной шкале. При этом Leaks работает в реальном времени: как только система обнаруживает утечку, она сразу сигнализирует разработчику. Это позволяет исправлять проблемы «на месте», не дожидаясь дампа и пост-анализа.
По данным WWDC 2022, Leaks способен обнаруживать даже сложные многоуровневые retain cycles — например, когда три и более объекта образуют замкнутую цепочку сильных ссылок. Для диагностики таких циклов граф Cycles & Roots незаменим: он наглядно показывает, как объекты замыкаются друг на друга.
Каждый узел графа — это объект, каждая стрелка — сильная ссылка. Цикл — это замкнутый контур из стрелок. Цвет узла показывает статус: красный — утёкший объект, зелёный — корень (GC Root), серый — промежуточный объект. Чтобы исправить утечку, найдите стрелку, которую можно сделать weak без нарушения логики — и замените тип ссылки в коде.
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 выполняется из Xcode двумя способами: через меню Product → Profile (⌘I) или через открытие Instruments как отдельного приложения в Launchpad. Первый способ удобнее: Xcode автоматически собирает приложение в профилировочном режиме и запускает его на подключённом устройстве с выбранным шаблоном. После остановки сеанса Instruments сохраняет трассировку в файл с расширением .trace.
Интерпретация результатов зависит от шаблона. Для Time Profiler смотрите на Call Tree, отсортированный по Self Weight — самые верхние методы — ваши основные узкие места. Для Allocations — на # Living после циклического сценария: если количество объектов выросло — ищите утечку. Для Leaks — на красные маркеры и граф Cycles & Roots. Сравнивайте результаты до и после оптимизации — это единственный способ подтвердить эффективность изменений.
// Командная строка для 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. Для анализа UI-производительности используйте шаблон Core Animation — он показывает скорость отрисовки кадров и выявляет лишние перерисовки View. Time Profiler и Allocations также работают со SwiftUI без ограничений.
Instruments — это универсальный профилировщик для всей экосистемы Apple, покрывающий CPU, память, сеть, графику и энергопотребление. Shark — это внутренний анализатор heap dump в LeakCanary, который специализируется исключительно на поиске утечек памяти на Android.
Instruments не встраивается в код приложения — это внешний инструмент, который подключается к запущенному процессу через Xcode. Никаких изменений в код вносить не нужно. Файлы .trace — это просто логи, которые не попадают в бинарник.
При стандартной частоте сэмплирования 1 мс оверхед Time Profiler составляет менее 3%. В режиме точной трассировки (каждый вызов функции) оверхед может достигать 20–30%, поэтому для повседневного профилирования используется сэмплирование. Точная трассировка нужна только для критических участков.
Результаты автоматически сохраняются в файл .trace в папке проекта. Файл можно открыть на другом Mac с Xcode для совместного анализа. Для экспорта в текстовый формат используйте xcrun xctrace export --input file.trace --output result.xml.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также