Поиск…


Вступление

Xcode включает приложение настройки производительности под названием «Инструменты», которое можно использовать для профилирования вашего приложения, используя всевозможные различные показатели. У них есть инструменты для проверки использования ЦП, использования памяти, утечек, активности файлов / сетей и использования энергии, просто чтобы назвать несколько. Очень легко начать профилирование вашего приложения с Xcode, но иногда не так легко понять, что вы видите, когда оно профилируется, что отталкивает некоторых разработчиков от возможности использовать этот инструмент в полном объеме.

Профайлер времени

Первым инструментом, на который вы будете смотреть, является Time Profiler . Через измеренные интервалы инструменты прекратят выполнение программы и проведут трассировку стека на каждом запущенном потоке. Подумайте об этом, нажав кнопку паузы в отладчике Xcode. Вот предварительный просмотр Time Profiler:

На этом экране отображается Call Tree . Call Tree показывает количество времени, затрачиваемого на выполнение различными способами в приложении. Каждая строка отличается от метода выполнения программы. Время, затрачиваемое в каждом методе, может быть определено из количества остановок профайлера в каждом методе. Например, если 100 выборок выполняются с интервалом в 1 миллисекунду , а определенный метод находится в верхней части стека в 10 образцах, то вы можете сделать вывод, что примерно 10% общего времени выполнения - 10 миллисекунд - было потрачено в этом методе. Это довольно грубое приближение, но оно работает!

Xcode's строке меню Xcode's выберите Product\Profile или press ⌘I . Это создаст приложение и запустит Инструменты. Вам будет предложено окно выбора, которое выглядит так:

Это все разные шаблоны, которые поставляются с инструментами.

Выберите инструмент Time Profiler и нажмите «Выбрать». Это откроет новый документ «Инструменты». Нажмите красную кнопку записи в левом верхнем углу, чтобы начать запись и запустить приложение. Вам может быть предложено ввести пароль для авторизации инструментов для анализа других процессов - не бойтесь, это безопасно здесь! В окне «Инструменты» вы можете увидеть отсчет времени и небольшую стрелку, перемещающуюся слева направо над графиком в центре экрана. Это означает, что приложение запущено.

Теперь начните использовать приложение. Найдите некоторые изображения и разверните их в один или несколько результатов поиска. Вероятно, вы заметили, что вхождение в результат поиска утомительно медленное, и прокрутка списка результатов поиска также невероятно раздражает - это ужасно неуклюжее приложение!

Ну, тебе повезло, потому что ты собираешься это исправить! Тем не менее, вы сначала получите быстрый контроль над тем, что вы смотрите на инструменты . Во-первых, убедитесь, что в селекторе представлений в правой части панели инструментов выбраны оба варианта:

Это обеспечит открытость всех панелей. Изучите скриншот ниже и объяснение каждого раздела под ним:

1. Это элементы управления записью . Красная кнопка «запись» остановится и запустит приложение, которое сейчас профилируется при нажатии (он переключается между значком записи и остановки). Кнопка паузы делает именно то, что вы ожидаете, и приостанавливает текущее выполнение приложения.

2. Это таймер запуска. Таймер подсчитывает, сколько времени работает профилирование приложения, и сколько раз оно было запущено. Если вы остановите и затем перезапустите приложение, используя элементы управления записью, это запустит новый прогон, и на дисплее появится «Run 2 of 2».

3. Это называется дорожкой. В случае выбранного шаблона Time Profiler существует только один инструмент, поэтому есть только один трек. Вы узнаете больше о специфике графика, показанного здесь позже в учебнике.

4. Это панель деталей. Он показывает основную информацию о конкретном инструменте, который вы используете. В этом случае он показывает методы, которые являются «самыми горячими», то есть теми, которые использовали наибольшее время процессора. Если вы нажмете на верхнюю панель, которая говорит «Дерево вызовов» (левая рука) и выберите «Пример списка», вам будет предоставлен другой вид данных. В этом представлении отображается каждый отдельный образец. Нажмите несколько выборок, и вы увидите, что полученная трассировка стека отображается в инспекторе расширенной детали.

5. Это панель инспекторов. Существует три инспектора: настройки записи, настройки дисплея и расширенная деталь. Вскоре вы узнаете больше о некоторых из этих вариантов.

Глубокое сверление

Выполните поиск изображений и сверьтесь с результатами. Мне лично нравится искать «собаку», но выбирайте все, что пожелаете, - вы можете быть одним из тех людей кошки!

Теперь прокрутите список вверх и вниз по списку несколько раз, чтобы у вас было хорошее количество данных в Time Profiler . Вы должны заметить числа в середине изменения экрана и заполнения графа ; это говорит о том, что используются циклы процессора .

Вы действительно не ожидали бы, что какой-либо пользовательский интерфейс будет таким же неуклюжим, как если бы этот table view не был готов к отправке, пока он не прокрутится, как масло! Чтобы помочь выявить проблему, вам нужно установить некоторые параметры.

С правой стороны выберите Инспектор настроек дисплея (or press ⌘+2) . В инспекторе в разделе Call Tree выберите «Разделить по потоку» , «Инвертировать Call Tree , «Скрыть отсутствующие символы» и «Скрыть системные библиотеки». Это будет выглядеть так:

Вот что каждый параметр делает с данными, отображаемыми в таблице слева:

Отдельно по потоку : каждый поток следует рассматривать отдельно. Это позволяет понять, какие потоки отвечают за наибольшее количество использования ЦП .

Инвертировать дерево вызовов. С помощью этой опции stack trace рассматривается сверху вниз. Обычно это то, что вы хотите, так как вы хотите увидеть самые глубокие методы, в которых процессор проводит свое время.

Скрыть отсутствующие символы: если файл dSYM не найден для вашего приложения или system framework , вместо того, чтобы видеть имена (символы) в таблице, вы увидите только шестнадцатеричные значения, соответствующие адресам внутри двоичного файла. Если эта опция выбрана, отображаются только полностью разрешенные символы, а неразрешенные шестнадцатеричные значения скрыты. Это помогает декларировать представленные данные.

Скрыть системные библиотеки. Когда этот параметр выбран, отображаются только символы из вашего собственного приложения. Часто бывает полезно выбрать эту опцию, так как обычно вам остается только заботиться о том, где процессор проводит время в своем собственном коде - вы не можете многое сделать о том, сколько CPU используются system libraries !

Flatten Recursion: эта опция рассматривает рекурсивные функции (те, которые называют себя) как одна запись в каждой stack trace , а не несколько.

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

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

Если вы используете приложение Objective-C , есть опция Show Obj-C Only : если это выбрано, то отображаются только методы Objective-C , а не любые функции C или C++ . В вашей программе их нет, но если вы смотрите на приложение OpenGL , у него может быть, например, C++ .

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

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

Чтобы узнать больше о том, что происходит внутри этого метода, дважды щелкните его строку в таблице. Это приведет к следующему представлению:

Ну, это интересно, не так ли! applyTonalFilter() - это метод, добавленный в UIImage в расширение, и почти 100 % времени, затраченного на него, тратится на создание CGImage после применения фильтра изображения.

Существует не так много, что можно сделать, чтобы ускорить это: создание изображения - довольно интенсивный процесс и занимает столько времени, сколько потребуется. Давайте попробуем отступить и посмотреть, откуда applyTonalFilter() . Нажмите « Call Tree на дорожке с сухарями вверху окна кода, чтобы вернуться к предыдущему экрану:

Теперь щелкните маленькую стрелку слева от строки applyTonalFilter в верхней части таблицы. Это откроет Дерево вызовов, чтобы отобразить вызывающего абонента applyTonalFilter. Возможно, вам придется развернуть следующую строку; при профилировании Swift иногда иногда появляются повторяющиеся строки в Дереве вызовов с префиксом @objc. Вы заинтересованы в первой строке с префиксом целевого имени вашего приложения (InstructionsTutorial):

В этом случае эта строка относится к cellForItemAtIndexPath коллекции результатов. Дважды щелкните строку, чтобы увидеть связанный код из проекта.

Теперь вы можете понять, в чем проблема. Метод применения тонального фильтра занимает много времени, и он вызывается непосредственно из cellForItemAtIndexPath, который будет блокировать main thread (и, следовательно, весь пользовательский интерфейс) каждый раз, когда он запрашивает отфильтрованное изображение.

ассигнования

Есть подробная информация обо всех создаваемых объектах и памяти, которая их поддерживает; он также показывает, что вы retain counts каждого объекта. Чтобы снова начать работу с новым instruments profile , закройте приложение «Инструменты». На этот раз создайте и запустите приложение и откройте Debug Navigator в области Navigators. Затем нажмите « Память», чтобы отобразить графики использования памяти в главном окне:

Эти графики полезны для быстрого представления о том, как работает ваше приложение. Но вам понадобится немного больше энергии. Нажмите кнопку « Profile in Instruments , а затем «Передача», чтобы включить эту сессию в « Инструменты» . Инструмент Allocations запустится автоматически.

На этот раз вы заметите два трека. Один называется Allocations, а один называется Leaks. Дорожка Allocations будет подробно обсуждена позже; дорожка утечек, как правило, более полезна в Objective-C и не будет рассмотрена в этом уроке. Итак, какую ошибку вы собираетесь отслеживать дальше? В проекте есть что-то скрытое, что вы, вероятно, не знаете, есть. Вероятно, вы слышали о утечке памяти. Но то, что вы, возможно, не знаете, состоит в том, что на самом деле существуют два типа утечек:

Истинные утечки памяти - это то, где объект больше не ссылается ни на что, но все еще выделяется - это означает, что память никогда не может быть повторно использована. Даже когда Swift и ARC помогают управлять памятью, наиболее распространенным видом утечки памяти является retain cycle or strong reference cycle . Это когда два объекта содержат сильные ссылки друг на друга, так что каждый объект удерживает другой от освобождения. Это означает, что их память никогда не выпускается!

Неограниченный рост памяти - это то место, где память продолжает выделяться и никогда не предоставляется шанс быть освобожденной . Если это будет продолжаться вечно, то в какой-то момент system's memory будет заполнена, и у вас будет большая проблема с памятью на ваших руках. В iOS это означает, что приложение будет убито системой.

С помощью инструмента Allocations, запущенного в приложении, выполните пять различных поисков в приложении, но пока не сверните их в результаты. Убедитесь, что результаты поиска имеют некоторые результаты! Теперь пусть приложение немного успокоится, подождав несколько секунд.

Вы должны были заметить, что график на дорожке Allocations растет. Это говорит вам, что память распределяется. Именно эта функция поможет вам найти unbounded memory growth .

То, что вы собираетесь выполнять, - это generation analysis . Для этого нажмите кнопку Mark Generation. Вы найдете кнопку в верхней части инспектора настроек дисплея:

Нажмите его, и в треке появится красный флаг, например:

Цель generation analysis состоит в том, чтобы выполнить действие несколько раз и посмотреть, растет ли память unbounded fashion . Просверлите поиск, подождите несколько секунд, чтобы изображения загрузились, а затем вернитесь на главную страницу. Затем отметьте поколение снова. Повторите это для разных поисков. После сверления нескольких поисковых систем инструменты будут выглядеть так:

На данный момент вы должны быть подозрительными. Обратите внимание на то, как синий график растет с каждым поиском, который вы пробуете . Ну, это конечно не хорошо. Но подождите, как насчет memory warnings? Вы знаете об этом, верно? Memory warnings - это способ iOS сообщать приложениям, что в отделении памяти все тесно, и вам нужно очистить память.

Возможно, этот рост связан не только с вашим приложением; это может быть что-то в глубине UIKit которое держится за память. Дайте системным фреймворкам и вашему приложению возможность очистить память перед тем, как указывать палец на один.

Имитируйте memory warning о memory warning , выбрав «Панель Instrument\Simulate Memory Warning в меню инструментов» или « Hardware\Simulate Memory Warning в строке меню simulator's . Вы заметите, что использование памяти немного уменьшилось, или, возможно, совсем нет. Конечно, не вернемся туда, где это должно быть. Таким образом, все еще существует неограниченный рост памяти .

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



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow