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

  Рет қаралды 7,149

Timur Shemsedinov

Timur Shemsedinov

5 жыл бұрын

Примеры кода: github.com/HowProgrammingWork...
Курс «Основы программирования» с примерами на JavaScript habr.com/ru/post/464023/
#производительность #бенчмаркинг #javascript #nodejs #лекции #программирование

Пікірлер: 20
@anatolykobzisty9827
@anatolykobzisty9827 5 жыл бұрын
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 Обобщение
@UniBreakfast
@UniBreakfast 3 жыл бұрын
В описание бы это.
@timashoff
@timashoff Жыл бұрын
Воистину How Programming Works! Спасибо!
@kirillguryanov4925
@kirillguryanov4925 2 жыл бұрын
Спасибо вам за труды !
@olehmudriy9308
@olehmudriy9308 4 жыл бұрын
Спасибо за контент
@TimurSevimli
@TimurSevimli Жыл бұрын
Спасибо за лекцию! Первый пример заняло в 20й и 18той ноде 5.30 - 6 секунд. На 12 той, 15 секунд, а на 10 той ноде одну секунду 😮
@Antonio-fm1sq
@Antonio-fm1sq 2 жыл бұрын
Спасибо!
@AlbertMaximov
@AlbertMaximov 3 жыл бұрын
54:45 было бы интересно узнать способ оптимизации массива, который работал бы быстрее объекта
@vitalaskompulat5053
@vitalaskompulat5053 5 жыл бұрын
здравствуйте может есть к видео план обучения и задания? Уже их (видео) так много на вашем канале, что непонятно как это все пройти, в каком порядке, и какие задания делать в качестве дополнения к видео
@TimurShemsedinov
@TimurShemsedinov 5 жыл бұрын
Можно смотреть по порядку в плейлистах, сначала HowProgrammingWorks, Async Programming и потом NodeUA. Лекции первого семестра сгруппированы в этой статье habr.com/ru/post/434686/
@AlbertMaximov
@AlbertMaximov 3 жыл бұрын
Решил написать тест для измерения скорости чтения свойств объекта. Для сравнения взял простой объект, 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'); }; benchmark.do(100000, [ objectSumFreeze, objectSum, objectSumSeal, mapSum, objectSumFreeze2, objectSum2, objectSumSeal2, mapSum2 ]); ==================================================================================================== objectSumFreeze2.........2140769........0% objectSum2...............3233271.......51% objectSumSeal2...........3371465.......57% objectSumSeal............5462137......155% mapSum...................5937373......177% mapSum2..................6354934......196% objectSumFreeze..........7087547......231% objectSum................8643897......303% objectSum2...............2854164........0% objectSumSeal2...........2909535........1% objectSumFreeze2.........3372526.......18% mapSum...................5007562.......75% mapSum2..................5780706......102% objectSumSeal............6013354......110% objectSumFreeze..........6789461......137% objectSum................9231559......223% objectSumFreeze2.........3147385........0% objectSumSeal2...........3589060.......14% objectSum2...............3747882.......19% mapSum...................5027435.......59% objectSumSeal............5985937.......90% mapSum2..................6313015......100% objectSumFreeze..........6999564......122% objectSum................8366595......165% Функции, запущенные по второму кругу, выполняются быстрее. Как предполагалось, чтение свойств замороженного объекта, выполняется быстрее, но не всегда. ==================================================================================================== Если убрать дублирование функций из бенчмарка, то результаты могут перемешиваться benchmark.do(100000, [ objectSumFreeze, objectSum, objectSumSeal, mapSum ]); objectSumSeal............5428490........0% mapSum...................5831870........7% objectSum................6541323.......20% objectSumFreeze..........7174810.......32% objectSumFreeze..........5562818........0% objectSumSeal............5930660........6% mapSum...................7652427.......37% objectSum................9122307.......63% mapSum...................6066717........0% objectSumFreeze..........6345885........4% objectSumSeal............7779511.......28% objectSum................8506414.......40% mapSum...................5514819........0% objectSumSeal............5592131........1% objectSumFreeze..........6848452.......24% objectSum................9148868.......65% но чтение из Map чаще быстрее ======== Но при увеличении количества повторений бенчмарка до 1000000 Map начинает сильно проседать benchmark.do(1000000, [ objectSumFreeze, objectSum, objectSumSeal, mapSum ]); objectSumFreeze.........32361461........0% objectSumSeal...........33237574........2% objectSum...............37241676.......15% mapSum..................57866529.......78% objectSumFreeze.........32518997........0% objectSumSeal...........35526579........9% objectSum...............36583779.......12% mapSum..................62036121.......90% objectSumSeal...........29541875........0% objectSumFreeze.........32988807.......11% objectSum...............38391651.......29% mapSum..................68963427......133% ==================================================================================================== Но на скорость влияет и порядок запуска тестируемых функций, если поставить чтение свойств простого объекта в начало, то она почти не отстает от "заморозки" benchmark.do(1000000, [ objectSum, objectSumFreeze, objectSumSeal, mapSum ]); objectSumSeal...........28102622........0% objectSumFreeze.........35129448.......25% objectSum...............35817087.......27% mapSum..................58748711......109% objectSum...............30164885........0% objectSumFreeze.........30727214........1% objectSumSeal...........32047031........6% mapSum..................61611587......104% objectSumSeal...........30457054........0% objectSum...............32506428........6% objectSumFreeze.........33400498........9% mapSum..................51892869.......70% ==================================================================================================== Но Map даже постановка в начало "не спасает" benchmark.do(1000000, [ mapSum, objectSum, objectSumSeal, objectSumFreeze ]); objectSumSeal...........30580341........0% objectSumFreeze.........31020966........1% objectSum...............35826840.......17% mapSum..................53168495.......73% objectSumFreeze.........31660807........0% objectSumSeal...........34770355........9% objectSum...............36510397.......15% mapSum..................53554082.......69% objectSumFreeze.........27236500........0% objectSumSeal...........29676618........8% objectSum...............35199768.......29% mapSum..................51061171.......87% Freeze почти всегда самый быстрый, с минимальным отставанием Seal, на 15-30% обычный объект, а Map отстаёт от Freeze почти в 2 раза. ==================================================================================================== Получается, что движок V8 хорошо оптимизирует frozen объект на чтение свойств, но почему это происходит не всегда и иногда перестановка и повторный прогон функций сильно меняют время выполнения?
@AlbertMaximov
@AlbertMaximov 3 жыл бұрын
В документации написано: _Map может иметь более высокую производительность в случаях частого добавления или удаления ключей._ Значит если преимущественно только чтение, то производительности не добавит
@mansur.gabidullin
@mansur.gabidullin 5 жыл бұрын
В примере 4-array.js не нашёл "приклеивание" метода age к элементам data1. Получается что это ошибка и соответственно бенчмарк для data1 выдаёт не правильный результат или я что-то недопонимаю? Объясните пожалуйста.
@user-ef3of9hh8f
@user-ef3of9hh8f 3 жыл бұрын
Подскажите, а вызов gc() работает синхронно или асинхронно? Может ли сборщик мусора влиять на точность замеров?
@TimurShemsedinov
@TimurShemsedinov 3 жыл бұрын
Максимально сильно влияет, весь V8 останавливается для этого, пока собирается мусор ничего в js не поисходит, параллельно может происходить разве что ожидание от внешних устройств в параллельных потоках, но в V8 эти результаты могут попасть только когда сбор мусора завершен. Но даже в этом случае лучше, когда мы сами вызываем gc, чем когда он приходит внезапно.
@alexeychelyshev2697
@alexeychelyshev2697 3 жыл бұрын
@@TimurShemsedinov Спасибо огромное за ваши видео на канале - для меня, это лучший ресурс для изучения.
@mariia_kramar
@mariia_kramar 5 жыл бұрын
Что значит инлайнить?
@TimurShemsedinov
@TimurShemsedinov 5 жыл бұрын
Инлайнинг функций, это подстановка тела функции в место ее вызова. Это один из способов оптимизации, реализуемый компилятором. Если функции маленькие, то лучше не делать вызов, а переместить ее код в место вызова. Кроме того, после инлайнинга могут открыться возможности для других оптимизаций, например, вынос инвариантов из циклов или удаление мертвого кода.
@UniBreakfast
@UniBreakfast 3 жыл бұрын
@@user-hs9uf8fg5k советская ещё система ценностей + здоровые интересы + желание практиковать освоенное и делиться знаниями, я полагаю.
@bobaandboba
@bobaandboba Жыл бұрын
Скорость 1.5. Не благодарите
Жайдарман | Туған күн 2024 | Алматы
2:22:55
Jaidarman OFFICIAL / JCI
Рет қаралды 1,8 МЛН
Мы никогда не были так напуганы!
00:15
Аришнев
Рет қаралды 6 МЛН
He sees meat everywhere 😄🥩
00:11
AngLova
Рет қаралды 12 МЛН
Интроспекция и рефлексия в JavaScript
1:02:33
Timur Shemsedinov
Рет қаралды 6 М.
Не пишите так в JavaScript. Оптимизируем код
36:30
WebDev с нуля. Канал Алекса Лущенко
Рет қаралды 32 М.
Типизированные массивы в JavaScript
39:43
Timur Shemsedinov
Рет қаралды 8 М.
Жайдарман | Туған күн 2024 | Алматы
2:22:55
Jaidarman OFFICIAL / JCI
Рет қаралды 1,8 МЛН