Используйте «измеряй прежде чем оптимизировать» как простой цикл: зафиксируйте базу, профилируйте, измените одну вещь, проверьте эффект — и выработайте спокойную привычку работы с производительностью.

Работа над производительностью кажется хаотичной, когда вы начинаете с фиксов. В один день вы минифицируете файлы, в другой — настраиваете кеширование, затем удаляете библиотеку. Иногда это помогает. Иногда — ничего не меняется, и вы не понимаете почему.
Самый большой риск — оптимизировать не то. Если страница медленная потому, что главный поток блокируется JavaScript, тратить часы на сжатие изображений почти ничего не даст. Или вы можете ускорить то, что пользователи даже не замечают, тогда как реальная задержка вызвана долгим API‑вызовом, переотрисовкой макета или одним блокирующим скриптом.
Есть и ловушка «по ощущениям». «Кажется быстрее» может быть эффектом плацебо (например, спиннер) или результатом теста в другой сети, на другом устройстве или в другое время. «Действительно быстрее» значит: то же действие в тех же условиях дало лучшие числа.
Простое правило решает большинство проблем: измеряйте перед оптимизацией, а затем решайте. Если относиться к производительности как к задаче измерения, вы перестанете гадать и начнёте учиться.
Практический цикл выглядит так: выберите одно пользовательское действие для улучшения, зафиксируйте базу в повторяемых условиях, внесите одно объяснимое изменение, затем перемерьте и оставьте правку только если числа улучшились.
Paul Irish — один из самых известных голосов в веб‑производительности. Через работу над инструментами браузера и рекомендации по производительности он помог популяризировать простую идею: ваша первая задача — не угадывать, что медленно, а доказать это.
Такой подход меняет динамику команды. Вместо споров вроде «картинки всегда виноваты» или «это, должно быть, фреймворк», вы начинаете с доказательств. Когда можно показать временную шкалу, медленный запрос или долгую задачу, разговор переходит от обвинений к исправлениям.
«Измеряйте перед оптимизацией» также остужает дебаты, потому что создаёт общие правила: договоритесь, что меряете, договоритесь, что значит «лучше», и празднуйте только когда числа меняются.
Это работает и на небольших сайтах, и на крупных приложениях. Одна базовая проверка может остановить случайные микро‑оптимизации на маркетинговой странице. В крупном продукте постоянные измерения не дадут перформансу превратиться в бесконечный список задач.
Простой способ сделать это реальным — относиться к производительности как к баг‑репорту: чёткие шаги воспроизведения, метрика, которую вы увидели, и одно изменение, привязанное к одному результату. Если двое не согласны, перезапустите измерение и пусть решают данные.
Сначала относитесь к производительности как к задаче инструментации: добавьте способы наблюдать за тем, что действительно видят пользователи. Если вы не видите проблему, вы будете спорить мнениями, а не фактами. В этом и есть смысл измерять сначала.
Инструментация не должна быть сложной. Это сбор нескольких сигналов последовательно, в одних и тех же местах, чтобы отвечать на базовые вопросы:
Обычно вам нужны два типа данных.
Лабораторные данные собирают в контролируемой среде: конкретный ноутбук или тестовое устройство, стабильный профиль сети, одинаковые шаги при каждом запуске. Это отлично для отладки, потому что замедление можно воспроизвести по требованию.
Данные реальных пользователей показывают то, что люди видят в «дикой природе»: разные устройства, локации и качество соединения. Они хороши для приоритизации, потому что показывают, что действительно мешает реальным людям, а не одному прогону.
Даже без глубоких знаний вы можете измерять вехи загрузки страницы (например, когда появляется первый контент), долгие задачи и блокировки главного потока, медленные сетевые запросы, дорогостоящую работу по рендерингу (layout, paint) и время ответа сервера.
Эти сигналы обычно хранятся в нескольких местах: DevTools браузера для лабораторного профилирования, серверные логи и трейсы для бэкенд‑таймингов, и аналитика или RUM‑дашборды для данных реальных пользователей. Например, если оформление заказа кажется медленным, DevTools может показать, что браузер занят рендером большого UI корзины, тогда как логи сервера показывают, что API быстрый. Без инструментации вы можете оптимизировать бэкенд и так и не исправить реальную проблему.
Чтобы измерять перед оптимизацией, нужен надёжный исход. База — это одно и то же действие, измеренное одинаково, в тех же условиях.
Начните с одного реального пользовательского пути, а не «всего сайта». Выберите то, что можно описать в одном предложении: например «открыть главную и прокрутить до первой сетки товаров» или «войти и попасть на дашборд». Узкая цель делает числа стабильнее и шаги понятнее.
Далее выберите 1–3 метрики, которые соответствуют пути. Для просмотра страницы обычно берут пару LCP (как быстро отображается основной контент) и TTFB (как быстро отвечает сервер). Для потока вроде оформления заказа фиксируйте время на завершение шага 1 и время ответа API платежа. Слишком много метрик облегчает выборку данных под желаемый результат.
Запишите настройки теста, чтобы кто‑то другой мог воспроизвести его позже. Небольшие различия могут повлиять на результат:
Наконец, определите «достаточно хорошо» для вашей аудитории. Например: «LCP < 2.5с на телефоне среднего класса при 4G». Если вы используете Koder.ai, снимок состояния перед тестированием помогает привязать базу к конкретной версии.
Потому что легко потратить часы на улучшение того, что на самом деле не вызывает задержку. Сначала докажите, куда уходит время (сеть, сервер, главный поток, рендеринг), а затем нацеливайтесь на самое большое узкое место.
Запишите одно конкретное действие и точные условия, затем повторите его:
Если вы не можете воспроизвести — вы не можете доверять результату.
Выберите 1–3 метрики, которые соответствуют тому, что замечают пользователи:
Не отслеживайте слишком много чисел одновременно — иначе начнёте подбирать данные под желаемый результат.
Лабораторные данные собираются в контролируемых условиях (отлично для отладки и воспроизведения). Ручные/реальные данные (RUM) показывают устройства, сети и поведение настоящих пользователей (отлично для приоритизации).
Хорошая практика: используйте реальные данные, чтобы найти худшие сценарии, затем используйте лабораторный профиль, чтобы понять, почему они медленные, и безопасно протестировать правки.
Обращайтесь с проблемой как с баг-репортом:
Это переводит обсуждение от мнений («всё из‑за картинок») к фактам.
Запишите взаимодействие в профайлер и ищите самый большой кусок времени:
Затем сформулируйте однофразную гипотезу, которую можно тестировать.
Это сохраняет причинно‑следственную связь. Если вы поменяете пять вещей и стало быстрее, вы не поймёте, что сработало. Если хуже — откататься будет проблемно.
Практическое правило: одна изменение, которое вы можете объяснить; одна метрика, которую ожидаете изменить; затем повторите измерение.
Повторите ту же самую настройку теста и сравните «до/после» по тем же метрикам.
Чтобы уменьшить шум:
Сохраняйте изменение только если числа улучшаются в тех же условиях.
Распространённые ошибки:
Придерживайтесь одного пути, одной настройки и одного проверенного результата.
Используйте их, чтобы делать эксперименты безопасными и сравнимыми:
Инструменты помогают, но настоящая польза в повторяемом цикле: baseline → profile → одно изменение → verify.