Site icon AppTractor

Оценка эффективности страниц в Airbnb на iOS

В Airbnb мы создали рейтинг Page Performance Score для предоставления нашим инженерам и специалистам по обработке данных множества ориентированных на пользователя показателей производительности, чтобы лучше понимать и улучшать наши продукты. В этом посте мы подробнее рассмотрим, как мы определяем эти метрики и используем их в iOS.

Система страниц

Весь путь к покупке на Airbnb разделен на разные страницы, каждая из которых имеет собственный измеренный показатель эффективности страницы (Page Performance Score, PPS). Для поддержки этой страничной системы отслеживания производительности мы создали стандартизированную инфраструктуру, которая позволяет инженерам определять страницы, представляющие их функции.

В iOS страница связана с UIViewController. Мы собираем данные о производительности на протяжении всего жизненного цикла UIViewController и передаем данные в лог только в viewDidDisappear. Этот лог не может быть создан или отправлен без PageName, универсального идентификатора страницы.

Инструментарий

Из-за множества крайних случаев и сложностей, связанных с инструментарием этих показателей, мы создали класс конечного автомата Page Performance Score, названный PPSStateMachine. Этот класс инкапсулирует всю логику для отслеживания и вычисления показателей производительности и создания событий логирования. Любой инженер, желающий зарегистрировать событие PPS, может сделать это, получив PPSStateMachine, связанный с его UIViewController, и вызвав соответствующие методы во время событий жизненного цикла UIViewController. Чтобы упростить задачу, мы создали дополнительные инструменты и инфраструктуру, поэтому инженерам нужно только указать имя для своей страницы и состояние контента — например, загрузка, загружено или ошибка.

PPSStateMachine

Время

При измерении производительности все время измеряется в наносекундах, а затем преобразуется в миллисекунды. Создавая псевдонимы для концепции наносекунд (UInt64) и миллисекунд (Float64) для более конкретных типов, мы заставляем разработчиков думать о масштабе при преобразовании в более часто используемые типы (например, Int, Float).

При измерении текущего времени мы используем монотонные часы, часы, значение которых монотонно увеличивается и будет продолжать увеличиваться, пока система спит. Значение имеет тип 64-битных наносекунды.

Для отметок времени начала и окончания события у нас есть вычисляемая переменная, которая возвращает текущее время в миллисекундах. Это позволяет нам избежать большинства ошибок точности из-за преобразования типов.

Пример

Ассоциации с View

Каждый UIViewController имеет связанный PPSStateMachine. Этот PPSStateMachine можно переопределить, если разработчик хочет измерить серию страниц под одним именем. Связывание с UIViewController позволяет найти PPSStateMachine в UIView путем обхода цепочки респондентов представления.

Управление версиями

Объявление жизненного цикла и семантических методов в протоколе PPS позволяет нам абстрагироваться от того, как рассчитывается оценка. Большинство обновлений формулы PPS — за исключением совершенно новых показателей, таких как производительность видео — не приводят к тому, что разработчикам нужно обновлять свои соответствующие функции. За кулисами любое серьезное изменение формулы сначала проверяется путем помещения потенциального значения в метаданные зарегистрированного события. После подтверждения потенциального значения его можно повысить до официального значения, которое влияет на оценку производительности страницы.

Реализация метрики

Время до первого макета (Time to First Layout, TTFL)

TTFL начинается во время viewDidLoad в UIViewController и заканчивается после первого viewDidLayoutSubviews.

Время до начальной загрузки (Time to Initial Load, TTIL)

TTIL начинается во время viewDidLoad в UIViewController и завершается через один цикл рендеринга после того, как загруженный контент был показан.

Зависание потока прокрутки (Scroll Thread Hangs, STH)

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

CADisplayLink точно сообщает о большинстве STH. RunLoop.Mode — это RunLoop.Mode.Tracking.

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

В iOS может работать отслеживание зависаний основного потока (Main Thread Hangs, MTH), однако точное отслеживание MTH влечет за собой небольшое, но постоянное снижение производительности. В наших тестах отслеживания MTH ЦП не мог засыпать, батарея разряжалась, и этот показатель не давал нам значительно больше информации о визуально воспринимаемой производительности, чем STH. В результате мы решили не измерять MTH на iOS.

Дополнительное время загрузки (Additional Load Time, ALT)

ALT запускается, когда показывается загрузчик, и завершается через один цикл рендеринга после того, как загрузчик ушел и содержимое показано.

Чтобы проиллюстрировать этот показатель, давайте взглянем на бесконечную прокрутку. Если нижняя часть показывается до того, как следующая страница будет загружена, то записанное ALT — это время, когда лоадер (или нижняя часть) виден до загрузки следующей страницы. Если нижний предел никогда не достигается, например, из-за предварительной выборки, тогда ALT  равен нулю. Для точного ведения логов нам необходимо знать процент прокрутки, виден ли нижний загрузчик и конечный автомат для отслеживания старого состояния.

Время загрузки мультимедийного содержимого (Rich Content Load Time, RCLT)

RCLT полностью скрыт от инженеров с помощью нашей абстракции представления, URLImageView, который способен показывать изображение из URL-адреса.

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

При каждом изменении состояния URLImageView он изменяет соответствующий PPSStateMachine путем сканирования цепочки респондентов представления и обновления конечного автомата в зависимости от того, загружено ли изображение или нет. PPSStateMachine вычислит продолжительность и удалит часть URL, сохранив только продолжительность, если она ниже указанного порога, чтобы логи не были слишком большими.

Резюме

Наша текущая реализация PPS на iOS позволяет инженерам быстро внедрять и получать реальные данные о производительности. Мы постоянно развиваемся и расширяем наши инструменты и инфраструктуру. Мы надеемся, что вы сможете применить и продвинуть наши знания в своей компании.

Источник

Exit mobile version