предисловие
Performance
Существование, которое нельзя игнорировать в области фронтенд-разработки.Если наша разработка - это продукт, который может удовлетворить наши потребности, мы можем его не использовать, но если мы хотим сделать окончательную оптимизацию нашего продукта, ИтакPerformance
Это отличный выбор, и его нельзя игнорировать.
Плюсы и минусы инструментов производительности и API
Performance 工具
преимущество:
- Визуальный графический интерфейс
- что-то делается каждую миллисекунду
- Порядок, в котором файлы выполняются и загружаются
- Эффект отображения интерфейса за миллисекунду
- Порядок и время выполнения каждого метода (снизу вверх)
- Перевернутый график пламени события (снизу вверх)
- Сводка данных
Performance 工具
недостаток:
- Невозможно просмотреть время работы в течение определенного интервала
- Не могу просмотреть
js
Использование размера кучи и ограничения - Не видно, обновляется или загружается страница, количество переадресаций
- Невозможно увидеть, когда начались тесты производительности
- Обработка обратного вызова может выполняться, когда кэш ресурсов заполнен.
- Устанавливает максимальное количество объектов ввода производительности, которые браузер должен хранить в своем буфере ввода производительности.
Performance api
преимущество:
- полностью выдуманный
Performance 工具
Недостатки данных также могут позволить нам узнать конкретное время с помощью данных.
Performance api
недостаток:
- не может быть похоже
Performance 工具
Просмотр информации о данных в графическом виде
Кратко представлены преимущества и недостатки инструментов и apis.На самом деле очевидно, что они дополняют друг друга.На самом деле, среди общих инструментов мы будем использовать один из них для оптимизации производительности, но для пользователя, который хочет Реальный и тщательная оптимизация производительности по-прежнему требует сотрудничества между ними для проведения более эффективной, систематической и комплексной оптимизации.
Инструменты производительности
ЭтоPerformance 工具
интерфейс.
- Стрелки вверх и вниз используются для загрузки и выгрузки каждого отчета о тестировании производительности;
-
no recordings
Это каждый отчет о тестировании, и оптимизацию производительности можно сравнить в соответствии с каждым отчетом о тестировании; -
Screenshots
Используется для просмотра изменений интерфейса в каждый период времени; -
Memory
Храните размер стека вызовов, разные размеры в разные периоды времени;
-
Disable Javascript samples
инвалидjavascript
Стек вызовов, объяснение позжеMain
часть подробно объясняется; -
Enable advanced paint instrumentation (slow)
записывать детали событий рендеринга; -
Network
Используется для изменения рендеринга интерфейса в различных сетевых средах; -
CPU
Используется для проверки работоспособности компьютера;
На этом этапе я кратко представил реальное значение вышеуказанных кнопок.Ниже приведена комбинация визуальных диаграмм и этих кнопок для тестирования производительности:
Этот тест производительности представляет собой скриншот теста оптимизации производительности, проведенного на веб-сайте Nuggets --> моя домашняя страница.
Часть 1: Обзор
Наиболее важным здесь является последовательность событий, выполняемых в каждый период времени, когда отображается весь интерфейс.С помощью приведенного выше рисунка мы можем узнать, что мы сделали в каждый период времени (с точностью до миллисекунд).Когда мышь помещается на Это, Мы также можем просмотреть рендеринг нашего интерфейса для каждого периода времени в виде большого изображения:
Когда вы отпустите его, щелкнув и сдвинув в определенное положение, вы можете просмотреть ситуацию рендеринга непосредственно в определенном интервале.
Часть II: Сеть
Network
Здесь мы можем увидеть последовательность загрузки наших ресурсов и какие ресурсы загружаются в какое время, Благодаря этому мы можем более интуитивно знать,Ресурсы загружаются параллельно
Часть 3: Рамки
Frames
Здесь на самом деле нужно проверить, когда мы изменили интерфейс, Разница между ним и первой частью в том, что когда интерфейс не изменился, он не записывает, а обзорная часть будет записывать.
Часть IV: Взаимодействие
В прочитанных мной статьях я редко встречаю эту часть, потому что когда какие-то интерактивные действия не применяются, то и функций этой части не будет, отсюда мы видим, что наггеты используют какие-то анимации.
Часть 5: Тайминги
Эта картинка не с официального сайта Nuggets, потому что после того, как проект запакован, нет соответствующего вызова события, поэтому эту часть запакованного сайта нельзя увидеть онлайн.
Часть VI: Основная
вотPerformance 工具
Его основная часть, известная какграфик пламени, Вот диаграмма выполнения события снизу вверх, можно просто понять, что приведенное выше является сводкой
Часть VII: Растр
Благодаря этому мы знаем, что официальный сайт Nuggets использует в общей сложности несколько потоков во внешней части.
这里有一个知识点,这里是指浏览器渲染的线程,而不是js的线程,特此声明一下,怕被有的同学拿js单线程来喷我😹
Часть 8: GPU
Здесь мы можем четко видеть, когда сайтGPU
ускорить
Часть IX: taskSchedulerForegroundBlockingWorker
Передний план планировщика задач блокирует рабочую программу.Здесь редко пользуюсь,и первый раз вижу.Жду пояснений что он тут делает.Обновляется.Если кто знает,тоже можете прокомментировать и скажи мне, я успею сделать улучшения
Часть 10: Память
упомянутый вышеMemory
опция, после ее проверки будет отображаться линейный график события, с помощью которого мы можем видеть выполнение разных событий в разные периоды времени.
Часть 11: Детали тестирования производительности
На нем 4 вкладки:Summary(性能摘要)
,Bottom-Up(事件列表,由下至上,对应 Main 火焰图)
,Call Tree(每个事件的子项信息)
,Event log(事件日志)
Далее мы подробно объясним
Резюме
На самом деле, мы можем с первого взгляда увидеть, что он используется для подсчета того, что мы сделали во временном диапазоне нашей производительности обнаружения:
-
Loading
: время загрузки -
Scripting
: время вычисления js -
Rendering
: время рендеринга -
Painting
: время рисования -
Other
:в другой раз -
Idle
: время простоя браузера
Снизу вверх (список событий)
здесь иMain
То, что мы видим внутри, на самом деле является соответствующим отношением.Отсюда мы можем увидеть список всех событий, а также детали каждого события.Self Time(自己调用的时间)
,Total Time(总调用时间,包括子项调用时间)
,Activity(行为,包括调用该事件的位置)
Дерево вызовов (информация о подпункте события)
Собственно, здесь иBottom-Up
Части одинаковые, поэтому я не буду слишком много объяснять, вы можете это увидеть, взглянув на них.
Журнал событий
Здесь больше, чем в предыдущемBottom-Up
иCall Tree
По сравнению с еще однимStart Time
Атрибут, этот атрибут на самом деле является временем начала, и какое событие выполняется с какого времени
здесь, оPerformance 工具
Введение находится здесь, если есть какие-либо неясные объяснения или есть проблемы, пожалуйста, прокомментируйте и укажите, я внесу своевременные исправления
Ниже я познакомлю васPerformance Api
Performance API
Performance
Используется для получения информации о производительности текущей страницы, ее иPerformance 工具
О разнице мы уже писали выше, поэтому повторяться здесь не буду.
注意:除了以下指出的情况外,该接口及其成员在 Web Worker 中可用。
此外,还需注意,performance 的创建和衡量都是同一环境下的。
即,如果你在主线程(或者其他 worker)中创建了一个 performance,那么它在另外的 worker 线程中是不可用的;反之亦然。
Далее, давайте представимPerformance API
свойства:
Performance.navigation(操作相关)
Свойство представляет собой объект с двумя значениями свойств, которыеredirectCount(重定向次数)
,type(操作的类型)
:
redirectCount
Значение этого атрибута указывает, сколько раз текущая страница была перенаправлена;
type
type(0)
: текущая страница представляется путем нажатия на ссылки, закладки и формы, или операций скрипта, или прямого ввода адреса в URL-адресе;
type(1)
: нажмите кнопку обновления страницы или страницу, отображаемую методом Location.reload();
type(2)
: при доступе к странице через историю и вперед и назад;
type(255)
: Любым другим путем
Performance.timing(延迟相关)
Информация о времени на текущей странице:
navigationStart
Удаление с предыдущей страницы в том же браузереunload
Отметка времени окончания (с точностью до миллисекунд)
unloadEventStart
unload
Отметка времени, когда событие было выполнено. Если предыдущей страницы нет или если предыдущая страница или одно из требуемых перенаправлений не из того же источника, это значение вернет 0
unloadEventEnd
unload
Отметка времени, когда событие было выполнено. Если предыдущей страницы нет или если предыдущая страница или одно из требуемых перенаправлений не из того же источника, это значение вернет 0
redirectStart
Временная метка начала первой переадресации HTTP. Если предыдущей страницы нет или если предыдущая страница или одно из требуемых перенаправлений не из того же источника, это значение вернет 0
redirectEnd
Отметка времени, когда было завершено последнее перенаправление HTTP (то есть, когда последний байт ответа HTTP был получен напрямую)
fetchStart
Представляет метку времени, когда браузер готов использовать HTTP-запрос для извлечения документа. Этот момент времени будет до того, как будут проверены какие-либо кеши приложений.
domainLookupStart
Указывает отметку времени начала запроса имени домена. Если используются постоянные соединения или информация хранится в кеше или локальном ресурсе, это значение будет таким же, какPerformanceTiming.fetchStart
последовательный
domainLookupEnd
Указывает метку времени окончания запроса имени домена. Если используются постоянные соединения или информация хранится в кеше или локальном ресурсе, это значение будет таким же, какPerformanceTiming.fetchStart
последовательный
connectStart
Возвращает метку времени начала отправки HTTP-запроса на сервер. Если используется постоянное соединение, возвращаемое значение эквивалентноfetchStart
стоимость имущества
connectEnd
Возвращает метку времени, когда соединение между браузером и сервером было установлено. Если установлено постоянное соединение, возвращаемое значение эквивалентноfetchStart
Стоимость имущества. Установление соединения означает завершение всех процессов рукопожатия и аутентификации.
secureConnectionStart
Возвращает метку времени, когда браузер и сервер начали рукопожатие по защищенной ссылке. Возвращает 0, если текущая веб-страница не требует безопасного соединения.
requestStart
Возвращает метку времени, когда браузер сделал HTTP-запрос к серверу (или когда он начал читать локальный кеш)
responseStart
Возвращает метку времени, когда браузер получил (или прочитал из локального кеша) первый байт с сервера. Если на транспортном уровне происходит сбой после запуска запроса и повторное открытие соединения, это свойство будет учитываться как соответствующее время создания нового запроса.
responseEnd
Возвращает отметку времени, когда браузер получил (или прочитал из локального кеша, или прочитал из локального ресурса) последний байт с сервера (или когда перед этим было закрыто HTTP-соединение)
domLoading
Возвращается, когда структура DOM текущей веб-страницы начинает анализироваться (т.е.Document.readyState
собственность становитсяloading
,соответствующийreadystatechange
отметка времени, когда событие было запущено)
domInteractive
Возвращает структуру DOM текущей веб-страницы, когда синтаксический анализ заканчивается и начинается загрузка встроенных ресурсов (т.е.Document.readyState
собственность становитсяinteractive
,соответствующийreadystatechange
отметка времени, когда событие было запущено)
domContentLoadedEventStart
Возвращает, когда парсер отправляетDOMContentLoaded
Событие, то есть отметка времени, когда все скрипты, которые необходимо выполнить, были проанализированы.
domContentLoadedEventEnd
Возвращает отметку времени, когда все сценарии, которые необходимо выполнить немедленно, были выполнены (независимо от порядка выполнения).
domComplete
Возвращает завершение парсинга текущего документа, т.е.Document.readyState
статьcomplete
и соответствующийreadystatechange
метка времени, когда он был запущен
loadEventStart
Вернуться на эту страницу,load
Отметка времени отправки события. Если это событие не было отправлено, его значение будет равно 0
loadEventEnd
вернуться, когдаload
Конец события, т. е. отметка времени завершения события загрузки. Если это событие не было отправлено или не завершено, его значение будет равно 0.
Performance.memory(js堆相关)
информация, связанная с кучей js:
jsHeapSizeLimit
ограничение размера кучи js
totalJSHeapSize
общий размер кучи js
usedJSHeapSize
Размер используемой кучи js
Performance.timeOrigin(性能检测开始时间)
Это свойство возвращает высокоточную метку времени начала измерения производительности.number
тип
Performance
И еще одно событие:
Performance.onresourcetimingbufferfull(性能缓存区已满时回调)
Это событие запускается, когда ресурсно-временной буфер браузера заполнен.
Давайте представимPerformance
Методы объекта:
Performance.clearMarks()
удаляет данную отметку из буфера ввода производительности браузера
Performance.clearMeasures()
Получить данную меру из входного буфера производительности браузера
Performance.clearResourceTimings()
Удалить все из буфера данных о производительности браузераentryType
даresource
изperformance entries
Performance.getEntries(PerformanceEntryFilterOptions)
PerformanceEntryFilterOptions
параметр
Необязательный параметр, представляющий собой объект, принимающий три свойства:
-
name
:performance entry
название -
entryType
:entry
Тип Юридическийentry
Тип можно изменить сPerformanceEntry.entryType
способ получить -
initiatorType
: тип инициализированного ресурса, например:xmlhttprequest
,other
,script
Performance.getEntries
возвращаемое значение
Performance.getEntries(PerformanceEntryFilterOptions)
Член массива возвращаемых значенийPerformanceEntry.startTime
хронологический порядок
Если не встречаетсяfilter
объект условий, то возвращается пустой массив, если аргументы не принимаются, возвращаются всеentries
Поскольку возвращаемое значение является массивом, давайте объясним значение каждого атрибута каждого элемента массива:
-
connectEnd
: время окончания соединения -
connectStart
: время начала подключения -
decodedBodySize
: Расшифрованный размер тела -
domComplete
:dom
время завершения рендера -
domContentLoadedEventEnd
:dom
Время окончания события загрузки контента -
domContentLoadedEventStart
:dom
Время начала события загрузки контента -
domInteractive
:dom
Время взаимодействия -
domainLookupEnd
: время окончания поиска домена -
domainLookupStart
: время начала поиска домена -
duration
: время события -
encodedBodySize
: кодировка размера тела -
entryType
: Тип ввода ресурса -
fetchStart
: получить время запуска ресурса -
initiatorType
: Тип спонсора -
loadEventEnd
: Загрузить время окончания события -
loadEventStart
: загрузить время начала события -
name
: Обычно это текущий запросurl
адрес -
nextHopProtocol
: протокол следующего перехода -
redirectCount
: количество перенаправлений -
redirectEnd
: время начала перенаправления, если перенаправления нет, значение равно 0 -
redirectStart
: время окончания перенаправления, если перенаправления нет, значение равно 0 -
requestStart
: Запросить время начала -
responseEnd
: время окончания ответа -
responseStart
: время начала ответа -
secureConnectionStart
: время начала безопасного соединения -
serverTiming
:серверное время -
startTime
:Время начала -
transferSize
: размер прохода -
type
: тип события -
unloadEventEnd
: удалить время окончания события -
unloadEventStart
: удалить время начала события -
workerStart
:worker
Время начала
Performance.mark(name)
Согласно данномуname
значение для создания связанной метки времени в буфере ввода производительности браузера
Performance.measure(name, startMark, endMark)
Здесь принимаются три параметра:
-
name
: название измерения -
startMark
: Имя начального маркера измерения (также может бытьPerformanceTiming
Имя свойства) -
endMark
: Имя конечного маркера измерения (также может бытьPerformanceTiming
Имя свойства)
Performance.getEntriesByName(name, type)
Здесь принимаются два параметра:
-
name
: название измерения -
type
: Тип измерения (frame, navigation
,resource
,mark
,measure
,paint
)
Performance.getEntriesByType(type)
получает параметр,type
то же, что и вышеPerformance.getEntriesByName(name, type)
изtype
Performance.now()
Возвращает число, представляющее количество миллисекунд, прошедших с момента измерения производительности.
Performance.setResourceTimingBufferSize(maxSize)
Устанавливает максимальное количество объектов ввода производительности, которые браузер должен хранить в своем буфере ввода производительности.
Performance.toJSON()
возвращениеPerformance
объектJSON
объект
Performance API
Введение почти такое же, и совместимость с браузером тоже очень хорошая:
В принципе, с тестированием производительности в нашем проекте проблем нет, ведь мы точно не можем запаковать код тестирования производительности в проект.
Performance API 的简单使用
Это небольшая демонстрация, которую я написал, примерно, что это значит:
То есть мы добавляем отметку перед выполнением таймераmeasure-start
;
После выполнения таймера добавляется еще один маркерmeasure-end
;
Измерьте время начала и продолжительность между двумя маркерамиmeasure-list
;
Наконец очистить всеmarks
биты флага иmeasures
бит флага;
Из этой небольшой демонстрации мы можем видеть ее практичность и удобство, отсюда мы можем видеть,Performance API
Он может охватывать множество методов для определения времени его вызова, иPerformance 工具
нет способа сделать это
В этом смысл того, что я имею в виду под комплементарностью
заключительные замечания
вот, в принципеPerformance 工具
иPerformance API
Различия и введение их соответствующих функций почти написаны.
Из приведенного выше объяснения мы можем понять, что разные вещи делают разные вещи.Хотя никто не может удовлетворить некоторые потребности, взаимное сотрудничество может улучшить ситуацию.
Если есть какие-либо места, где объяснение не подробное, или есть ошибки в содержании объяснения, пожалуйста, укажите на это, чтобы я мог быстрее внести исправления.Спасибо каждому другу, который внимательно прочитал статью и увидел ее здесь .
Для следующей статьи может быть два варианта:
- vue и react используют Performance, чтобы определить, что быстрее (упрощенный демонстрационный тест)
- Аудиты (с точностью до каждого поля в файле отчета аудита аудита)
Если у вас есть какие-либо идеи, пожалуйста, оставьте сообщение, спасибо за вашу поддержку