Статьи

Использование пользовательского знака для анализа производительности вашего кода JavaScript

Работая над некоторым продвинутым кодом JavaScript, таким как 3d-движок, вы можете спросить себя, что вы можете оптимизировать и сколько времени вы тратите на какие-то конкретные фрагменты кода.

Не стесняйтесь пинговать меня в Твиттере (@deltakosh), если вы хотите обсудить эту статью!

Не могу дождаться, чтобы увидеть, о чем эта статья? Смотрите это видео:

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

образ

Обратите внимание, что с новыми инструментами F12, которые мы поставили с  Windows 10 Technical preview , профилировщик теперь является частью окна реагирования пользовательского интерфейса (кстати, мне действительно нравится новый дизайн…):

образ

Давайте рассмотрим другие варианты, которые могут дать вам более полное представление о том, как работает ваш код.

console.time

Вам просто нужно вызвать  console.time ()  и  console.timeEnd ()  вокруг фрагмента кода, который вы хотите оценить. Результатом является строка в вашей консоли, отображающая время, прошедшее между  time  и  timeEnd .

Это довольно простой и легко подражать, но я нашел эту функцию очень простой в использовании.

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

Это, например, то, что я сделал для  Babylon.js :

console.time("Active meshes evaluation");
this._evaluateActiveMeshes();
console.timeEnd("Active meshes evaluation");

Этот вид кода можно найти во всех основных функциях, а затем, когда включено ведение журнала производительности, вы можете получить действительно полезную информацию:

образ

Вы должны быть предупреждены, что рендеринг текста в консоль может потреблять мощность процессора

Даже если эта функция сама по себе не является стандартной функцией, совместимость браузера довольно велика. Chrome, Firefox, IE, Opera и Safari поддерживают это.

объект производительности

Если вам нужно что-то более наглядное, вы также можете использовать объект производительности ( рекомендация W3C  /  Можно ли использовать? ). Среди  других интересных функций, которые помогут вам измерить производительность веб-страницы, вы можете найти функцию под названием  mark,  которая может генерировать метку пользователя.

Пользовательский знак — это связь имени со значением времени. Вы можете измерить части кода с помощью этого API, чтобы получить точные значения. Вы можете найти отличную статью об этом API Аурелио де Роса на  Sitepoint .

Сегодня идея состоит в том, чтобы использовать этот API для визуализации определенных пользовательских отметок на экране Отзывчивости пользовательского интерфейса:

образ

Этот инструмент позволяет вам записывать сеанс и анализировать использование процессора:

образ

Затем мы можем увеличить конкретный кадр, выбрав запись « Обратный вызов кадра анимации » и щелкнув по ней правой кнопкой мыши, чтобы выбрать «фильтр по событию».

Выбранный кадр будет отфильтрован:

образ

Благодаря новому инструменту F12 вы можете переключиться на стеки вызовов JavaScript, чтобы получить более подробную информацию о том, что произошло во время этого события:

образ

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

И вот тут пользовательские отметки входят в игру  (Go Hawks!). Мы можем добавить свои собственные  маркеры,  а затем разбить фрейм и посмотреть, какая функция является более дорогой и так далее.

performance.mark("Begin of something…just now!");

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

performance.mark("Active meshes evaluation-Begin");
this._evaluateActiveMeshes();
performance.mark("Active meshes evaluation-End");
performance.measure("Active meshes evaluation", "Active meshes evaluation-Begin", "Active meshes evaluation-End");

Давайте посмотрим, что вы можете получить с  babylon.js babylon.js,  например, со   сценой «V8» :

образ

Вы можете попросить  babylon.js создать  пользовательские метки и показатели для вас, используя  слой отладки :

образ

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

образ

Вы можете видеть, что пользовательские метки отображаются поверх самого события (оранжевые треугольники), а также сегментов для каждой меры:

образ

Тогда очень легко определить, что, например, фазы [Render target] и [Main render] являются самыми дорогими.

Полный код, используемый  babylon.js,  чтобы позволить пользователям измерять производительность различных функций, выглядит следующим образом:

Tools._StartUserMark = function (counterName, condition) {
if (typeof condition === "undefined") { condition = true; }
if (!condition || !Tools._performance.mark) {
return;
}
Tools._performance.mark(counterName + "-Begin");
};




Tools._EndUserMark = function (counterName, condition) {
if (typeof condition === "undefined") { condition = true; }
if (!condition || !Tools._performance.mark) {
return;
}
Tools._performance.mark(counterName + "-End");
Tools._performance.measure(counterName, counterName + "-Begin", counterName + "-End");
};




Tools._StartPerformanceConsole = function (counterName, condition) {
if (typeof condition === "undefined") { condition = true; }
if (!condition) {
return;
}




Tools._StartUserMark(counterName, condition);




if (console.time) {
console.time(counterName);
}
};




Tools._EndPerformanceConsole = function (counterName, condition) {
if (typeof condition === "undefined") { condition = true; }
if (!condition) {
return;
}




Tools._EndUserMark(counterName, condition);




if (console.time) {
console.timeEnd(counterName);
}
};

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