Как измерять производительность веб-приложения

Как измерять производительность веб-приложения

Одной цифрой здесь не обойтись — всё равно что пытаться оценить ликвидность квартиры только по цене за квадратный метр. Производительность веб-приложения складывается из трёх слоёв: как быстро пользователь видит интерфейс, как быстро тот откликается на действия и насколько стабильно всё это работает под реальной нагрузкой. Если зациклиться исключительно на «времени загрузки страницы», легко пропустить проблемы, которые незаметно режут конверсию и удержание.

Что вообще считать производительностью веб-приложения

Производительность — это не абстрактное «быстро/медленно», а набор измеримых характеристик. В моей практике я выделяю пять ключевых групп: момент появления первого контента, скорость отрисовки основного блока, отзывчивость на клики и скролл, визуальную стабильность вёрстки и поведение серверной части под нагрузкой. Одна и та же страница может бодро отдавать HTML, но бесить пользователя тяжёлым JavaScript или скачущими блоками, которые сдвигаются, пока грузятся картинки.

Базовые группы метрик

Группа метрик Что показывает Где особенно важно
Визуальная загрузка Момент, когда пользователь понимает, что страница «живая», а не пустой белый экран Лендинги, каталоги, карточки товаров — всё, где первое впечатление решает, останется ли посетитель
Отзывчивость Задержка между действием пользователя и реакцией интерфейса SPA, личные кабинеты, формы, фильтры — сценарии, где человек активно взаимодействует, а не просто читает
Стабильность интерфейса Насколько сильно «прыгает» вёрстка во время загрузки и работы Медийные страницы, рекламные вставки, длинные ленты — любое место, где поздняя подгрузка контента может сбить пользователя с толку
Серверная скорость Время ответа backend’а на запросы API, поиск, авторизация, оформление заказа — критические точки, где задержка напрямую влияет на бизнес-показатели
Нагрузка и масштабирование Поведение системы при росте числа одновременных пользователей Акции, распродажи, релизы, пиковые часы — моменты, когда инфраструктура либо вывозит, либо теряет деньги

Какие метрики измерять в первую очередь

1. TTFB — время до первого байта

TTFB показывает, как быстро сервер начинает отдавать ответ. Это чисто серверная метрика: она не зависит от того, насколько тяжёлый у вас фронтенд. Если TTFB высокий, копайте в сторону backend’а, базы данных, кэширования или CDN. Часто проблема кроется в медленных запросах к БД, отсутствии кэша на уровне приложения или в том, что сервер находится далеко от пользователя. В своих моделях я всегда смотрю на TTFB в связке с географией: для пользователей из регионов задержка может быть кратно выше, чем для столичных.

2. FCP — First Contentful Paint

FCP фиксирует момент, когда на экране появляется первый значимый элемент — текст, изображение, фон. Это ранний сигнал: пользователь видит, что страница не зависла. Если FCP затянут, причина обычно в блокирующих ресурсах: синхронном JavaScript, тяжёлых CSS или медленном ответе сервера. Практический совет: проверьте, не грузите ли вы в скрипты, без которых можно обойтись на старте.

3. LCP — Largest Contentful Paint

LCP показывает, когда появляется основной контент — крупный баннер, заголовок, изображение товара. Именно эта метрика лучше всего коррелирует с ощущением «быстроты» у пользователя. Если LCP плохой, а TTFB и FCP в норме, значит, проблема в рендеринге: слишком большое изображение, неоптимизированный шрифт или клиентский JavaScript, который долго строит DOM. Здесь работает простое правило: всё, что попадает в LCP, должно загружаться максимально приоритетно.

4. INP — Interaction to Next Paint

INP измеряет, как быстро интерфейс отвечает на действие: клик, нажатие клавиши, тап. Это метрика отзывчивости, и она критична для любых интерактивных приложений. Страница может загрузиться мгновенно, но если после клика на кнопку фильтра проходит полсекунды, пользователь воспринимает это как тормоз. Высокий INP обычно связан с длительными задачами в основном потоке: тяжёлые обработчики событий, синхронные вычисления, перерисовка больших кусков DOM. Как и в финансовом анализе, здесь важны не только средние значения, но и хвосты: у части пользователей на слабых устройствах задержка может быть в разы выше.

5. CLS — Cumulative Layout Shift

CLS показывает суммарное смещение видимых элементов за время жизни страницы. Это метрика визуальной стабильности. Представьте, что вы читаете карточку товара, и вдруг кнопка «Купить» уезжает вниз из-за загрузившегося баннера. Высокий CLS обычно вызывают изображения без явных размеров, поздно подгружаемые шрифты, динамические вставки контента (реклама, чаты). Решение простое: всегда резервируйте место под асинхронно загружаемые блоки и задавайте width/height для картинок.

Какие дополнительные показатели полезны

Помимо Core Web Vitals, в реальной эксплуатации я обязательно отслеживаю серверные и прикладные метрики. Они не видны пользователю напрямую, но без них диагностика неполна:

  • Время ответа API — p50, p95, p99 по каждому критическому эндпоинту.
  • Количество запросов в секунду — throughput, который держит система до деградации.
  • Процент ошибок — 4xx и 5xx, особенно в пиковые моменты.
  • Пиковая нагрузка — максимальное число одновременных соединений, которое выдерживает инфраструктура.
  • Размер страницы и вес основных ресурсов — общий объём передаваемых данных, разбивка по типам (JS, CSS, изображения, шрифты).
  • Количество запросов к базе данных — помогает найти узкие места на уровне хранения.
  • Использование CPU, памяти и диска — на сервере и в браузере (для тяжёлых клиентских приложений).
  • DNS-время и поведение CDN — особенно важно, если аудитория распределена географически.

Как измерять производительность на практике

Шаг 1. Зафиксируйте, что именно важно для продукта

Не пытайтесь измерять всё подряд. Сначала определите 5–7 ключевых пользовательских сценариев, которые напрямую влияют на бизнес. Для интернет-магазина это может быть цепочка: поиск → карточка товара → корзина → оформление заказа. Для CRM — вход в систему, открытие списка объектов, фильтрация и сохранение сделки. Именно эти пути должны стать эталонными точками для постоянного мониторинга. Такой подход я использую и при анализе рынка недвижимости: сначала выделяю самые ликвидные сегменты, а потом считаю экономику по каждому отдельно.

Шаг 2. Разделите метрики на полевые и лабораторные

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

Шаг 3. Измеряйте на уровне браузера

Для клиентских метрик используйте встроенные Performance API и наблюдатели (PerformanceObserver). Они дают доступ к FCP, LCP, INP, CLS, TTFB и множеству других показателей. Схема простая: собираете метрики на странице, отправляете их в свою аналитику, а затем сравниваете в разрезе версий приложения, типов устройств и регионов. Такой конвейер данных позволяет быстро находить регрессии после релиза.

Шаг 4. Измеряйте сервер отдельно

Никогда не смешивайте фронтенд и backend в одну кучу. Если API отвечает за 2 секунды, никакая оптимизация картинок не спасёт пользовательский опыт. И наоборот: быстрый сервер не компенсирует раздутый клиентский JavaScript. Для backend’а я обязательно отслеживаю:

  • p50, p95 и p99 времени ответа — чтобы видеть не только «среднюю температуру по больнице»;
  • ошибки 4xx и 5xx — их рост часто сигнализирует о проблемах раньше, чем жалобы пользователей;
  • throughput — сколько запросов в секунду система обрабатывает до заметной деградации;
  • нагрузку на базу данных и внешние сервисы — часто именно они становятся бутылочным горлышком.

Шаг 5. Проверяйте не только среднее, но и хвосты

Среднее время ответа — плохой советчик. Оно скрывает разброс. Как в оценке доходности недвижимости нельзя смотреть только на среднюю ставку аренды по району, так и здесь: если среднее время ответа API — 300 мс, а p95 — 2 секунды, значит, 5% пользователей видят откровенно плохой опыт. Именно эти хвосты чаще всего коррелируют с оттоками и негативом. Поэтому в своих дашбордах я всегда вывожу перцентили, а не только среднее.

Чем измерять

Задача Что использовать Что получаете
Визуальные и пользовательские метрики Браузерные Performance API (PerformanceObserver, Paint Timing, Layout Instability) FCP, LCP, INP, CLS, TTFB и десятки других показателей в реальном времени
Проверка страницы в лаборатории Lighthouse, WebPageTest, Chrome DevTools с троттлингом сети и CPU Повторяемые замеры для сравнения релизов и поиска регрессий
Нагрузка на сервер Инструменты нагрузочного тестирования (k6, Artillery, wrk) Поведение под трафиком: время ответа, ошибки, throughput, точка насыщения
Постоянный мониторинг Системы алертинга и дашборды (Grafana, Prometheus, New Relic, Datadog) Быстрое обнаружение деградации и аномалий после деплоя

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

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

Типовые ситуации

  • Высокий TTFB, нормальный фронтенд — проблема на стороне сервера: медленная бизнес-логика, долгие запросы к БД, отсутствие кэша, неэффективная маршрутизация.
  • Низкий TTFB, плохой LCP — страница долго рендерит основной контент. Скорее всего, виноваты неоптимизированные изображения, блокирующий CSS или клиентский JS, который поздно строит ключевой элемент.
  • Нормальный LCP, плохой INP — интерфейс тяжёлый при взаимодействии. Ищите длинные задачи в основном потоке, частые перерисовки, отсутствие debounce на обработчиках.
  • Высокий CLS — проблема в вёрстке и динамических вставках. Проверьте, всем ли изображениям и iframe заданы размеры, не подгружаются ли шрифты поздно, не вставляется ли контент поверх существующего без резервирования места.
  • Хорошие средние значения, плохой p95 — деградация у части пользователей. Чаще всего это связано с географией (далёкий CDN), медленными сетями или старыми устройствами. Здесь поможет сегментация данных по регионам и типам соединений.

Частые ошибки при измерении

  • Смотреть только на время загрузки страницы — игнорируется отзывчивость и стабильность, а именно они формируют субъективное ощущение качества.
  • Ориентироваться исключительно на среднее значение — хвосты (p95, p99) часто указывают на проблемы, которые затрагивают наиболее чувствительную аудиторию.
  • Измерять на локальном мощном компьютере — выводы нельзя переносить на реальных пользователей со слабыми устройствами и мобильным интернетом.
  • Смешивать метрики фронтенда и backend в одну таблицу — теряется возможность локализовать узкое место. Всегда разделяйте клиент и сервер.
  • Не разделять мобильный и десктопный сценарий — на мобильных устройствах производительность может быть принципиально иной из-за ограничений CPU и сети.
  • Игнорировать медленные регионы и слабые устройства — если ваша аудитория распределена, оптимизация только под столичный WiFi даст ложное чувство безопасности.
  • Оптимизировать «ради цифры» — гнаться за идеальным Lighthouse score, забывая о реальном пользовательском опыте. Метрики должны отражать бизнес-цели, а не быть самоцелью.

Практический чек-лист

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

  • Определены ли 3–5 ключевых пользовательских сценариев, которые напрямую влияют на конверсию или удержание?
  • Для каждого сценария выбраны критичные метрики (LCP, INP, CLS, время ответа API)?
  • Зафиксирована ли базовая линия (baseline) до начала изменений?
  • Отслеживаются ли p95 и p99, а не только средние значения?
  • Разделены ли фронтенд и backend метрики в мониторинге?
  • Есть ли замеры на реальных мобильных устройствах (не только в эмуляторе)?
  • Анализируется ли поведение по регионам и типам соединения (4G, 3G, Wi-Fi)?
  • Настроен ли регрессионный мониторинг, который автоматически сравнивает метрики после каждого релиза?

Как понять, что приложение стало быстрее

Снижение цифр в отчёте — ещё не победа. Ориентируйтесь на реальные признаки улучшения пользовательского опыта:

  • Контент появляется раньше — пользователь быстрее получает информацию.
  • Интерфейс отвечает на действия без ощутимых пауз — нет «залипаний» при кликах и скролле.
  • Снижается число жалоб на «подвисания» и «тормоза» от пользователей и службы поддержки.
  • Пользователи реже бросают сценарий на середине — растёт конверсия в целевое действие.
  • После релиза не растёт количество ошибок и медленных запросов — стабильность не принесена в жертву скорости.

Минимальный набор для старта

Если нужно внедрить измерение производительности без лишней сложности, начните с этого набора. Он покрывает все критические слои и не требует сложной инфраструктуры:

  • TTFB — время до первого байта
  • FCP — First Contentful Paint
  • LCP — Largest Contentful Paint
  • INP — Interaction to Next Paint
  • CLS — Cumulative Layout Shift
  • p95 времени ответа основного API
  • Процент ошибок (5xx и 4xx) на ключевых эндпоинтах
  • Throughput (запросов в секунду) на критических сценариях

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

Вывод

Измерение производительности веб-приложения — это не разовая акция, а система наблюдения, охватывающая загрузку, отзывчивость, визуальную стабильность и серверную часть. Самый практичный подход, который я выработал за годы работы с данными: выбрать ключевые пользовательские сценарии, измерять их отдельно на фронтенде и backend’е, смотреть не только средние, но и хвосты распределения, а затем регулярно сравнивать результаты после каждого релиза. Только так можно отличить реальное улучшение от игры в цифры.

FAQ

Какие метрики самые важные для веб-приложения?

В первую очередь — TTFB, FCP, LCP, INP и CLS, а также p95 времени ответа API. Этот набор покрывает и визуальную загрузку, и отзывчивость, и стабильность, и серверную часть.

Почему нельзя ограничиться временем загрузки страницы?

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

Что важнее: фронтенд или backend?

Оба слоя критичны. Backend определяет, как быстро приходят данные, а фронтенд — как быстро они превращаются в интерактивный интерфейс. Проблема в любом из них испортит пользовательский опыт, поэтому оптимизировать нужно комплексно.

Нужно ли измерять на реальных устройствах?

Да. Лабораторные тесты удобны для сравнения версий, но реальный опыт отражают только полевые данные с разнообразных устройств и сетей. Без них вы рискуете пропустить проблемы, которые затрагивают значительную часть аудитории.

Как часто нужно проверять производительность?

После каждого значимого релиза — обязательно. И постоянно в фоновом режиме через мониторинг и алерты, чтобы ловить деградацию как можно раньше, а не по жалобам пользователей.