Измерение производительности кода и оптимизация в JavaScript и Node.js

preview_player
Показать описание


#производительность #бенчмаркинг #javascript #nodejs #лекции #программирование
Рекомендации по теме
Комментарии
Автор

00:00:00 Введение
00:05:27 Console.time и console.timeEnd
00:09:05 New Date( ).getTime( )
00:11:15 Process.hrtime( )
00:18:51 Process.hrtime.bigint( ) и движок для benchmark
00:27:00 Сравнение функций инстанцирования
00:31:06 Алгоритм для сравнения
00:39:36 Работа движка benchmark
00:41:37 Результаты теста
00:47:33 Сравнение массива и объектов
00:54:21 Результаты теста
00:55:00 Сравнение 3 функций range
00:56:34 Результаты теста
00:58:50 Сравнение функций по способу вызова
00:59:56 Результаты теста
01:01:34 Сравнение indexOf и includes
01:01:54 Результаты теста
01:03:23 Сравнение объявления переменной до и после цикла
01:05:02 Сравнение for keys, for (...in...) и for (...of...)
01:05:34 Результаты теста
01:05:58 Сравнение шаблонных строк
01:06:12 Сравнение хождения цикла по функции map в ES6
01:07:18 Результаты теста
01:07:56 Сравнение repeat и arrayJoin
01:08:15 Результаты теста
01:08:26 Сравнение дублирования массива
01:08:58 Результаты теста
01:09:43 Сравнение копирование набора данных
01:10:26 Результаты теста
01:10:47 Сравнение итерирования с помощью forEarch и for (...of...)
01:11:08 Результаты теста
01:11:31 Обобщение

anatolykobzisty
Автор

Воистину How Programming Works!
Спасибо!

timashoff
Автор

Спасибо за лекцию!
Первый пример заняло в 20й и 18той ноде 5.30 - 6 секунд.
На 12 той, 15 секунд, а на 10 той ноде одну секунду 😮

TimurSevimli
Автор

здравствуйте может есть к видео план обучения и задания? Уже их (видео) так много на вашем канале, что непонятно как это все пройти, в каком порядке, и какие задания делать в качестве дополнения к видео

vitalaskompulat
Автор

54:45 было бы интересно узнать способ оптимизации массива, который работал бы быстрее объекта

AlbertMaximov
Автор

Подскажите, а вызов gc() работает синхронно или асинхронно? Может ли сборщик мусора влиять на точность замеров?

АлексейЧелышев-фс
Автор

Решил написать тест для измерения скорости чтения свойств объекта. Для сравнения взял простой объект, Object.seal({...}), Object.freeze({...}) и Map.
Причём функции сложения продублировал для запуска их в разном порядке

'use strict';

const benchmark = require('./2-benchmark.js');

const ooo = {
Ab: 27,
Aperiam: 8,
Aspernatur: 17,
Lorem: 0,
adipisicing: 6,
amet: 4,
assumenda: 28,
beatae: 18,
consectetur: 5,
cum: 9,
debitis: 19,
dolor: 2,
dolore: 10,
elit: 7,
error: 11,
est: 12,
et: 13,
fuga: 14,
ipsum: 1,
itaque: 15,
natus: 20,
perferendis: 21,
quaerat: 29,
qui: 22,
quos: 23,
ratione: 24,
repellendus: 25,
sit: 3,
ut: 16,
voluptas: 26
}
ooo.aaa = 444
const objectSum = () => {
return ooo.Aspernatur + ooo.assumenda + ooo.cum;
};

const objectSum2 = () => {
return ooo.Aspernatur + ooo.assumenda + ooo.cum;
};


const ooo2 = {
Ab: 27,
Aperiam: 8,
Aspernatur: 17,
Lorem: 0,
adipisicing: 6,
amet: 4,
assumenda: 28,
beatae: 18,
consectetur: 5,
cum: 9,
debitis: 19,
dolor: 2,
dolore: 10,
elit: 7,
error: 11,
est: 12,
et: 13,
fuga: 14,
ipsum: 1,
itaque: 15,
natus: 20,
perferendis: 21,
quaerat: 29,
qui: 22,
quos: 23,
ratione: 24,
repellendus: 25,
sit: 3,
ut: 16,
voluptas: 26
}
ooo2.aaa = 444
Object.seal(ooo2)

const objectSumSeal = () => {
return ooo2.Aspernatur + ooo2.assumenda + ooo2.cum;
};

const objectSumSeal2 = () => {
return ooo2.Aspernatur + ooo2.assumenda + ooo2.cum;
};

const ooo3 = {
Ab: 27,
Aperiam: 8,
Aspernatur: 17,
Lorem: 0,
adipisicing: 6,
amet: 4,
assumenda: 28,
beatae: 18,
consectetur: 5,
cum: 9,
debitis: 19,
dolor: 2,
dolore: 10,
elit: 7,
error: 11,
est: 12,
et: 13,
fuga: 14,
ipsum: 1,
itaque: 15,
natus: 20,
perferendis: 21,
quaerat: 29,
qui: 22,
quos: 23,
ratione: 24,
repellendus: 25,
sit: 3,
ut: 16,
voluptas: 26
}
ooo3.aaa = 444
Object.freeze(ooo3)

const objectSumFreeze = () => {
return ooo3.Aspernatur + ooo3.assumenda + ooo3.cum;
};

const objectSumFreeze2 = () => {
return ooo3.Aspernatur + ooo3.assumenda + ooo3.cum;
};

const mmm = new Map([
['Ab', 27],
['Aperiam', 8],
['Aspernatur', 17],
['Lorem', 0],
['adipisicing', 6],
['amet', 4],
['assumenda', 28],
['beatae', 18],
['consectetur', 5],
['cum', 9],
['debitis', 19],
['dolor', 2],
['dolore', 10],
['elit', 7],
['error', 11],
['est', 12],
['et', 13],
['fuga', 14],
['ipsum', 1],
['itaque', 15],
['natus', 20],
['perferendis', 21],
['quaerat', 29],
['qui', 22],
['quos', 23],
['ratione', 24],
['repellendus', 25],
['sit', 3],
['ut', 16],
['voluptas', 26]
])

const mapSum = () => {
return mmm.get('Aspernatur') + mmm.get('assumenda') + mmm.get('cum');
};
const mapSum2 = () => {
return mmm.get('Aspernatur') + mmm.get('assumenda') + mmm.get('cum');
};

[
objectSumFreeze,
objectSum,
objectSumSeal,
mapSum,
objectSumFreeze2,
objectSum2,
objectSumSeal2,
mapSum2
]);






























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



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

[
objectSumFreeze,
objectSum,
objectSumSeal,
mapSum
]);





















но чтение из Map чаще быстрее


Но при увеличении количества повторений бенчмарка до Map начинает сильно проседать
[
objectSumFreeze,
objectSum,
objectSumSeal,
mapSum
]);


















Но на скорость влияет и порядок запуска тестируемых функций, если поставить чтение свойств простого объекта в начало, то она почти не отстает от "заморозки"
[
objectSum,
objectSumFreeze,
objectSumSeal,
mapSum
]);


















Но Map даже постановка в начало "не спасает"
[
mapSum,
objectSum,
objectSumSeal,
objectSumFreeze
]);















Freeze почти всегда самый быстрый, с минимальным отставанием Seal, на 15-30% обычный объект, а Map отстаёт от Freeze почти в 2 раза.



Получается, что движок V8 хорошо оптимизирует frozen объект на чтение свойств, но почему это происходит не всегда и иногда перестановка и повторный прогон функций сильно меняют время выполнения?

AlbertMaximov
Автор

В примере 4-array.js не нашёл "приклеивание" метода age к элементам data1. Получается что это ошибка и соответственно бенчмарк для data1 выдаёт не правильный результат или я что-то недопонимаю? Объясните пожалуйста.

mansur.gabidullin