Рубрики
Без рубрики

Профилирование веб-характеристик: Instacart.com

Продуктовые магазины утомительно и потребляют время. В поисках более оптимизированного опыта я решил попробовать Instacart. К сожалению, используя их сайт …

Автор оригинала: Todd Gardner.

Продуктовые магазины утомительно и потребляют время. В поисках более оптимизированного опыта я решил попробовать Instacart. К сожалению, используя их сайт Также утомительное и много времени.

Общие действия занимают слишком много

В видео вы увидите, что я пытаюсь посетить посадочную страницу моего местного продуктового магазина и, после этой нагрузки, сделайте поиск Йогурт Отказ

Посещение домашней страницы продуктового магазина и поиска предметов.

Над 25 секунд, чтобы выполнить одну нагрузку и поиск. Просто загрузка страницы Cub Foods “Storefront” заняла 14 секунды и 154 Запросы.

Сетевая статистика для загрузки одного витрина в Instacart.

Загрузка одного витрина

На стороне плюса была очень хорошая графика заполнителя, которая настроила настроение, пока я ждал.

Графика заполнителя в течение нескольких дней

Когда это не ошибка JavaScript

Обычно, когда я смотрю на «современные» веб-сайты, основной производительностью виновника является JavaScript. Слишком много сценариев, делающих слишком много рендеринга. Пока Instacart делает Имейте слишком много JavaScript, у них есть большая проблема: Сервер Отказ

Начальная страница нагрузки медленная

Instacart использует некоторую комбинацию сервера и рендеринга клиента. С одной стороны, это здорово, что они не просто загружают пустую страницу с большой спиннер в середине и ждут 20 МБ JavaScript для загрузки.

3 секунды, чтобы загрузить основную страницу скелет

С другой стороны, это заняло 3 секунды, чтобы вернуть скелет одноразового макета.

Три секунды для некоторых шаблонов заполнителя HTML немного долго.

Просто базовый спа-шаблон

Изображения для заполнения шаблона заполнителя заняли еще несколько секунд:

4 секунды для фонового изображения

Если вы заметите первый сегмент URL после домена Cloudfront IS /156x/ Отказ Эти конечные точки вернут изображения пользовательских размеров, и этот первый сегмент является запрошенным размерами. Вы можете изменить этот сегмент в /300x/ Например, и вы получите большее изображение, которое поддерживает соотношение сторон (он будет шириной 300 пикселей тем, что бы высокая должна быть высота, чтобы сохранить соотношение). Вы также можете указать высоту, если вы хотите другой эффект:

Размеры пользовательских изображений великолепны, но дорогостоящие для производительности

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

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

API тоже медленно

Это не просто нагрузка страницы и изображения, которые медленно. Серверы, отвечающие на запросы API, также принимают свое время. Некоторые звонки для заполнения данных на странице воспользовались 5 Десятки!

Несколько вызовов API заняли более 5 секунд

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

Защитники хороши, но более быстрые конечные точки лучше

Вот где модель гибридной рендеринга немного распадается. Есть много динамического контента, оказываемых нагрузкой на страницу. И поскольку API медленный, пользователь становится еще более заполненным.

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

API по требованию вызовы нагрузки дополнительных продуктов медленные.

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

Заполнители крутые, но скорость будет лучше.

Защитники делают хорошую работу по минимизации Jank или Кумулятивный макет Shift Но они плохие заменители фактического содержания. Как ни парадоксально я нахожу, что они также могут заставить сайт чувствовать себя медленнее, так как пользовательский интерфейс изменяется от пользователя так часто.

Может быть, Instacart не думает, что у него проблема с производительностью?

Есть немногие статьи на Инженерский инженерный блог Обсуждая внутреннюю техническую реализацию сайта. В обоих связанных статьях они обсуждают «улучшенную производительность» и существующие «здоровые характеристики» сайта. Возможно, главная проблема в том, что они не думают, что есть проблема с производительностью, чтобы исправить?

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