Большая сводка производительности внешнего интерфейса

внешний интерфейс JavaScript React.js CSS

Производительность на стороне узла

оценка эффективности

  1. Оценивается инструментами тестирования производительности:

    • wrk: Поддерживает сценарии lua, которые могут легко справиться с различными потребностями тестирования, такими как
    -- 带随机参数请求
    function request()
        wrk.headers["Connection"] = "keep-Alive"
        arg = math.random(1, 500)
        path = "/random?arg=" .. arg
        return wrk.format("GET", path)
    end
    
  2. Просмотр данных процесса выполнения программы через профилирование v8,Используется совместно с Webstorm, вы можете настроить его в Webstorm [Конфигурации запуска/отладки], обратите внимание, что вам нужно сначала установить его:v8-profiler

Общие решения по оптимизации

  1. Параллельные запросы, например: promise.all одновременные трехсторонние вызовы HTTP-интерфейса, вызовы RPC
  2. Если вы используете mysql
    • Используйте пул соединений с базой данных для повторного использования соединений
    • Индексирование общих запросов
    • Программно избегайте запросов на объединение
    • разделение чтения-записи
  3. Добавить стратегию кэширования

Фронтальная производительность

DNS-запрос

  • Уменьшить количество DNS-запросов

TCP/HTTP

Оптимизировать ядро

  1. Устраните и уменьшите ненужную задержку в сети
  2. Минимизируйте количество передаваемых байтов

Конкретные шаги

  • Сокращение HTTP-запросов: для HTTP1.0/1.1 уменьшите количество запрашиваемых ресурсов (упаковка, сжатие, слияние и т. д.).
  • Используйте CDN
  • Добавьте заголовок Expires и настройте тег ETag
  • GZip-ресурсы
  • Избегайте перенаправления HTTP
  • Постоянное соединение: избегайте трехстороннего рукопожатия TCP, HTTP1.1 включен по умолчанию, HTTP1.0 может использовать: Соединение: Keep-Alive
  • HTTP1 не поддерживает мультиплексирование и может открывать несколько сеансов TCP (обычно 6) параллельно для хоста.
  • Удалите ненужные байты запроса (запрос HTTP1, заголовки ответов не сжимаются)
  • Встроенные ресурсы, такие как: встроенные ресурсы Base64 (для небольших ресурсов статического изображения)

рендеринг на стороне клиента

Критический путь рендеринга: DOM -> CSSDOM/JS -> RenderTree -> Layout -> Paint

процесс рендеринга в браузере

Создайте DOM

  • Процесс строительства: персонаж -> Токен -> Узел -> Дом
  • инкрементная сборка

Создание CSSOM (объектная модель CSS)

  • Процесс построения: персонаж, токен, узел, CSSOM
  • Чем сложнее селектор, тем больше времени требуется для сопоставления

Построить рендердерево

  • RenderTree содержит всю информацию об узле, которая должна быть отображена на странице.
  • Элементы с display: none не будут добавлены в RenderTree, потому что их не нужно рендерить, элементы с visible: hidden будут добавлены в RenderTree

Layout

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

Paint

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

Оптимизация ресурсов

Оптимизация производительности CSS (предотвратить блокировку ресурсов при первоначальном рендеринге)

  • медиа-запрос (добавить медиа к ссылке)
    • В этот момент таблица стилей все еще будет загружена и не будет блокировать рендеринг, если среда браузера не соответствует условиям медиа-запроса.
    • Разделяйте файлы CSS для разных сред мультимедиа, чтобы избежать блокировки первоначального рендеринга и загрузки некритических ресурсов CSS.
  • Добавление ссылок с помощью DOM API не блокирует первоначальный рендеринг
var style = document.createElement('lin');
style.rel = 'stylesheet';
style.href = 'index.css';
document.head.appendChild(style);
  • предварительная загрузка, предварительная выборка и предварительная визуализация (не только для CSS)
    • rel="preload", а не таблица стилей не будет блокировать рендеринг
    • Предварительная загрузка — это функция, определенная в спецификации подсказки ресурса.Подсказка ресурса сообщает браузеру, что нужно установить соединение или загрузить ресурсы заранее, чтобы повысить скорость загрузки ресурсов:
      • предварительная загрузка: https://www.w3.org/TR/preload/
      • предварительная выборка и предварительная обработка: https://w3c.github.io/resource-hints/#prefetch
    • Когда браузер встречает ссылку, помеченную как предварительная загрузка, он начинает ее загружать.
    • Когда происходит событие загрузки, измените rel на таблицу стилей, чтобы применить этот стиль.
    • Вы можете использовать предварительную загрузку (CSS preload polyfill) через loadCSS.js: принцип на самом деле заключается в использовании DOM API.
<link rel="preload" type="text/css" href="./style.css" as="style" onload="this.rel='stylesheet'"/>

Оптимизация производительности JS

  • JS блокирует HTML Parse (парсер HTML, инкрементный) и, таким образом, блокирует рендеринг тегов HTML, которые появляются после скриптов.
  • Причина: JS может модифицировать поток HTML-документа через document.write, поэтому при выполнении JS браузер будет приостанавливать работу по парсингу DOM
  • CSS блокирует JS
  • Стратегия загрузки ресурсов браузера (предварительная загрузка, которая отличается от предыдущей предварительной загрузки CSS, см.: https://juejin.cn/post/6844903545016156174)
    • Когда синтаксический анализатор HTML заблокирован сценарием, хотя синтаксический анализатор прекратит построение DOM, он все равно распознает ресурсы, стоящие за сценарием, и загрузит их заранее.
  • Оптимизация производительности (для предотвращения блокировки)
    • Поместите ресурс в нижней части тела
    • Используйте отсрочку, чтобы отложить выполнение скрипта: с отсрочкой скрипт будет отложен до тех пор, пока весь HTML-документ не будет проанализирован перед началом выполнения. Скрипт отсрочки будет выполняться в строгом соответствии с порядком, в котором он появляется в HTML-документе. Используя метод defer, ресурсы скрипта могут быть загружены раньше.
    • Используйте async для асинхронной загрузки скрипта: скрипт не будет блокировать синтаксический анализатор HTML и не будет заблокирован CSS, и он начнет выполняться при загрузке скрипта. async подходит для независимых ресурсов без зависимостей (таких как код статистики Baidu)

картина

  • Асинхронная загрузка с большим двоичным объектом
  • использоватьimg-2Вместо тега img (принцип тот же, что и выше) легко увеличить скорость доступа более чем в пять раз для сайтов с большим количеством картинок

шрифт

  • Чтобы избежать FOUT (Flash Of Unstyled Text), браузер попытается дождаться завершения загрузки шрифта, прежде чем отображать содержимое с примененным шрифтом. Вызывает FOIT (проблема Flash Of Invisible Text), что приводит к пустому пространству.
  • Установить несколько шрифтов, метод понижения: использовать шрифт по умолчанию
  • Загружать файлы шрифтов асинхронно: загружая CSS асинхронно, вы можете избежать блокировки рендеринга шрифта, иначе он будет пустым.

разное

Оптимизация критического пути рендеринга

оптимизировать цель

  • количество критических ресурсов
  • критический объем ресурсов
  • Количество сетевых циклов для ключевых ресурсов

Не встраивайте ресурсы вслепую

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

Встраивание и кэширование в сочетании

  • При первом посещении используйте встроенные ресурсы и асинхронно запрашивайте кешированные ресурсы (например, rel="prefetch"). Кэш успешно передает тег файла cookie. При следующем посещении возвращается только тег внешнего ресурса.

разное

Общий инструмент

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

Релевантная информация

Пополнить

TTFB (время до первого байта):

  • Время, которое требуется от клиента, делающего запрос, до получения первого байта ответа (Transfer-Encoding: chunked)

Основной дизайн HTTP2.0:

  • Устранить «блокировку начала очереди» в HTTP;
  • Двоичный механизм кадрирования устраняет необходимость устанавливать несколько TCP-соединений, тем самым улучшая использование TCP.
  • Сохраняйте семантику HTTP 1.1

Блокировка начальника линии:

  • Блокировка заголовка строки приложения HTTP: отправка запросов в соответствии с приоритетом
  • Блокировка заголовков на транспортном уровне TCP: TCP требует, чтобы пакеты доставлялись в строгом порядке.

Оптимизация производительности React Time Slicing (с приостановкой):