SlideShare a Scribd company logo
pragmadash Денис Речкунов
Ведущий JavaScript-разработчик
Отзывчивый UI без блокировки Event Loop
Что такое производительность JavaScript?
• Время исполнения кода
• Алгоритмические оптимизации
• Куча нечитабильного "оптимизированного" кода
• Грязные хаки для VM, которые ускоряют код
2
Что такое производительность UI?
• Как быстро работает приложение для пользователя
• Насколько быстро оно реагирует на действия
• Приложение не подвисает
3
Почему приложение может подвисать?
• iframe – убийца производительности
• repaint & re`ow – неоптимальная верстка или CSS
• Блокировка Event Loop
4
#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов
Почему Event Loop блокируется?
• Внешние тяжелые обработчики внутри браузера
repaint & re`ow, iframe
• Блокирующий JavaScript-код
6
Блокирующий код
function sort(arr) {
var tmp = null;
for(var i = 0; i < arr.length; i++)
for(var j = 0; j < arr.length - 1; j++)
if(arr[j] > arr[j+1]) {
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
7
В чем же он блокирующий?
• Не рассчитан на очень большие массивы
• На время сортировки все приложение зависнет
8
Неблокирующая версия
function sortStep(arr, i, j, callback) {
if(arr[j] > arr[j + 1]) {
var tmp = arr[j];
var[j] = arr[j + 1];
arr[j + 1] = tmp;
}
if (++j === arr.length - 1) {
i++; j = 0;
}
if (i === arr.length) {
callback();
return;
}
setTimeout(sortStep.bind(this, arr, i, j, callback));
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
9
Неблокирующая версия
function sort(arr, callback) {
if (arr.length < 2) {
callback();
return;
}
sortStep(arr, 0, 0, callback);
}
01.
02.
03.
04.
05.
06.
07.
10
Демо
Преимущества неблокирующего кода
• UI всегда жив и обрабатывает события
• Параллельное исполнение функций
• Пользователю приятнее работать с приложением
12
Недостатки неблокирующего кода
• Он сложный
• Общее время исполнения больше
13
Полезные ссылки
• Philip Roberts: What the heck is the event loop anyway? | JSConf EU 2014
• Loupe by Philip Roberts
14
Денис Речкунов, Flamp
Ad

Recommended

#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
#6 "Изоморфный фреймворк Catberry.js" Денис Речкунов
JSib
 
#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов
JSib
 
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
#7 "Многообещающий JavaScript – Promises" Денис Речкунов
JSib
 
React.js – intro
React.js – intro
Andrew Makarow
 
#13 "Управление состоянием в Redux" Роман Сальников
#13 "Управление состоянием в Redux" Роман Сальников
JSib
 
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Как мы разрабатываем новый фронтенд / Филипп Нехаев (Tinkoff.ru)
Ontico
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
 
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Vue.js и его брат-близнец Vue-server.js / Андрей Солодовников (НГС)
Ontico
 
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Ontico
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Ontico
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?
Vladimir Malyk
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ontico
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Ontico
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
JSib
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)
Ontico
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
Ontico
 
"Посмотрим на Акку-Джаву" Дмитрий Мантула
"Посмотрим на Акку-Джаву" Дмитрий Мантула
Fwdays
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Ontico
 
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Fwdays
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
Ontico
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
non-blocking java script
non-blocking java script
Ecommerce Solution Provider SysIQ
 
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
Fwdays
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
Olesya_V
 

More Related Content

What's hot (20)

Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Ontico
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Ontico
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?
Vladimir Malyk
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ontico
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Ontico
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
JSib
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)
Ontico
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
Ontico
 
"Посмотрим на Акку-Джаву" Дмитрий Мантула
"Посмотрим на Акку-Джаву" Дмитрий Мантула
Fwdays
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Ontico
 
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Fwdays
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
Ontico
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
non-blocking java script
non-blocking java script
Ecommerce Solution Provider SysIQ
 
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
Fwdays
 
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Ontico
 
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Как мы ускоряли WebGL / Мстислав Живодков (2GIS)
Ontico
 
Современный фронтенд -- как не утонуть в море хайпа?
Современный фронтенд -- как не утонуть в море хайпа?
Vladimir Malyk
 
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
55+1 прием для улучшения Javascript-кода / Татьяна Бабич (Simbirsoft)
Ontico
 
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Переезжаем с Zabbix на Prometheus / Василий Озеров (fevlake)
Ontico
 
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
#3 "Webpack и Vue.JS: Создание больших приложений и их расширение" Кирилл Кай...
JSib
 
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
Стажировка-2014, занятие 8. Обзор Sails framework (Node.js)
7bits
 
How to build solid CI-CD pipeline / Илья Беда (beda.software)
How to build solid CI-CD pipeline / Илья Беда (beda.software)
Ontico
 
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
base.network — пиринговый веб на JavaScript / Денис Глазков (Lazada Rus)
Ontico
 
"Посмотрим на Акку-Джаву" Дмитрий Мантула
"Посмотрим на Акку-Джаву" Дмитрий Мантула
Fwdays
 
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Быстрый старт iOS приложения на примере iOS Почты Mail.Ru / Николай Морев (Ma...
Ontico
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Ontico
 
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Сергей Морковкин "Разработка realtime SPA с использованием VueJS и RethinkDB"
Fwdays
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
Ontico
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
Mikhail Davydov
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
Sergey Xek
 
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
"Изоморфная разработка на javascript с помощью react.js" Максим Климишин
Fwdays
 

Similar to #11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов (20)

Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
Olesya_V
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Dev2Dev
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
Трудовые будни инженера производительности
Трудовые будни инженера производительности
Vladimir Sitnikov
 
Инструментируй это
Инструментируй это
Roman Dvornov
 
[1.3] Мониторинг событий ИБ — мастерим «дашборд» - Тарас Иващенко
[1.3] Мониторинг событий ИБ — мастерим «дашборд» - Тарас Иващенко
OWASP Russia
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Oleg Chirukhin
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
Мониторинг веб приложений на PHP в режиме реального времени с помощью Pinba. ...
Мониторинг веб приложений на PHP в режиме реального времени с помощью Pinba. ...
Igor Miniailo
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Vadim Nesterov
 
Cеминар в Виннице (22.03.2014)
Cеминар в Виннице (22.03.2014)
Alexander Babich
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
Andrew Mayorov
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
Andrey Rebrov
 
еще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложений
snowytoxa
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Kaspersky
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
Regn
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
 
Кирилл Комлев. О реализации continuous integration для web проектов
Кирилл Комлев. О реализации continuous integration для web проектов
Olesya_V
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
D2D Pizza JS Илья Беда "Куда мы все катимся?"
D2D Pizza JS Илья Беда "Куда мы все катимся?"
Dev2Dev
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
Трудовые будни инженера производительности
Трудовые будни инженера производительности
Vladimir Sitnikov
 
Инструментируй это
Инструментируй это
Roman Dvornov
 
[1.3] Мониторинг событий ИБ — мастерим «дашборд» - Тарас Иващенко
[1.3] Мониторинг событий ИБ — мастерим «дашборд» - Тарас Иващенко
OWASP Russia
 
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Graal, Truffle, SubstrateVM and other perks: what are those and why do you ne...
Oleg Chirukhin
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
Мониторинг веб приложений на PHP в режиме реального времени с помощью Pinba. ...
Мониторинг веб приложений на PHP в режиме реального времени с помощью Pinba. ...
Igor Miniailo
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Vadim Nesterov
 
Cеминар в Виннице (22.03.2014)
Cеминар в Виннице (22.03.2014)
Alexander Babich
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
Andrew Mayorov
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
Andrey Rebrov
 
еще один недостаток современных клиент серверных приложений
еще один недостаток современных клиент серверных приложений
snowytoxa
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Kaspersky
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
Regn
 
Ad

More from JSib (6)

#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
JSib
 
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
JSib
 
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
JSib
 
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
JSib
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
JSib
 
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
JSib
 
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
#12 "Создание двух desktop приложений на node-webkit и Electron” Михаил Реенко
JSib
 
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
#10 "Опыт создания Real-time игры на WebGL, Angular, Socket.io и Node.js" Его...
JSib
 
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
#9 "Chrome DevTools: отладка, консоль, профилирование" Роман Сальников
JSib
 
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
#4 "Особенности разработки кросс-браузерных расширений" Сергей Рашитов
JSib
 
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
JSib
 
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
#1 "JSib – Знакомство и амбициозные планы" Денис Речкунов
JSib
 
Ad

#11 "Отзывчивый UI без блокировки Event Loop" Денис Речкунов