SlideShare a Scribd company logo
Не бойся,это всего лишь данные...
просто их много
Роман Дворнов
Ostrovok.ru
О себе
•Работаю в Ostrovok.ru
•Автор фреймворка basis.js
2
Данные
3
Когда говорят про
данные на client-side,
чаще всего, подразумевают
объекты и их наборы
(модели и коллекции)
4
Сегодня есть опыт,
разнообразные библиотеки,
быстрые браузеры,
мощные API...
5
... но многие по-прежнему
скептически относятся к
сложным вычислениям и
системам на client-side
6
Client-side глазами скептиков...
7
Все ли так плохо?
8
Хороший «плохой» пример
9
Или как заставить браузер страдать
bower.io/search
10
~10 000 модулей
~2,5 Мб JSON
11
~10 000 модулей
~2,5 Мб JSON
~8 сек браузер "висит"!
12
ААааа!!!!.. Все пропало!...
Нужно грузить постранично...
14
Постойте, не так быстро...
Почему?
15
Что делает скрипт
16
• загружает JSON (массив объектов)
• генерирует 4 небольших списка
• генерирует таблицу на ~10 000 строк
• отдает таблицу компоненту, который
разбивает её на страницы и удаляет все
строки, кроме первых десяти
17
Timeline – Что делает браузер
Что делает браузер
• javascript ~2,85 сек
• парсиг html (из шаблонов) ~0,75 сек
• расчет стилей ~1,6 сек
• layout (~200 000 узлов) ~2.8 сек
• еще несколько секунд асинхронно (по 100)
"индексируются" строки для поиска
18
А можно быстрее?
19
Можно!
• генерация представлений ~0,04 сек
• применение данных ~0,15* сек
20
* и можно быстрее
lahmatiy.github.io/bower-search
github.com/lahmatiy/bower-search
21
Timeline – Применение данных
только JavaScript – ничего лишнего
Чак одобряет
22
Хорошие новости:
Переделали – теперь работает быстро
23
Вывод:
Дело не в количестве данных,
а в неэффективном подходе
24
Проблема
современного фронтенда
25
Многие веб-разработчики думают
через призму jQuery-like подходов,
размышляют про данные через
представление (верстку)
26
27
Пара примеров
По мотивам «старого» bower.io/search
28
+
=
$('#components')
.find('.created time, .updated time')
.timeago();
Разметка ради разметки
29
Невидимая ячейка,
ее innerHTML используется для поиска
30
Item.prototype.values = function(tr, columns) {
var values = {};
for (var i = 0; i < columns.length; i++) {
var name = columns[i];
var td = tr.getElementsByClassName(name)[0];
values[name] = td ? td.innerHTML : '';
}
return values;
};
Получение значений для поиска
В общем случае
31
Data
В общем случае
31
HTMLData
В общем случае
31
HTML DOMData
В общем случае
31
Data*
HTML DOMData
В общем случае
31
Data*
HTML DOMData
В общем случае
31
Data*
HTML DOMData
В общем случае
31
Data*
HTML DOMData
WTF?!
В общем случае
31
Data*
HTML DOMData
WTF?!
Данные в
исходном виде
Фактически, DOM используется
как хранилище данных
32
И это самое медленное,
что можно придумать
33
8,0 с vs. 0,2 с
34
40 : 1
Цифры говорят сами за себя
Не используйте
DOM для хранения данных!
35
А как надо-то?
36
Работа с данными –
вне представлений, в
абстрактном слое
37
Задача представлений –
отражать состояние данных
38
Идеальный вариант
39
Data
Идеальный вариант
39
DOMData
Идеальный вариант
39
DOMData
Идеальный вариант
39
DOMData
Helpers Helpers
Идеальный вариант + хелперы
40
Data DOM
View
bindings
...
Model
Collection
...
Хелперы упрощают разработку,
но добавляют overhead
41
Быстрая работа с DOM
42
Наиболее перспективное направление
DOM-based templates
Фреймворки: React, Ractive, Meteor, Basis.js...
Доклад «Как построить DOM»
tinyurl.com/build-dom
Быстрая работа с данными
43
Практически никто об этом не думает :(
Якобы основная проблема –
рендеринг
Модель ≠ представление
44
Данных может быть
гораздо больше,
чем представлений
bower.io/search
45
10 000+ модулей
bower.io/search
45
10 000+ модулей
кастомные выборки, мгновенная
фильтрация и сортировка
bower.io/search
45
10 000+ модулей
без участия сервера
кастомные выборки, мгновенная
фильтрация и сортировка
Демо блог – 5 000 постов
46
показываем
постранично
Имея все посты
генерируем
облако тегов
и архив
на клиенте
tinyurl.com/basis-blog
Каковы пределы?
47
С каким количеством моделей
мы можем работать?
48
1 000
10 000
100 000
1 000 000
???
49
Конечные ресурсы:
память и время
50
Память
51
Все чего-то стоит
• массив: 16bytes
• +12bytes + 4bytes/item (для литералов)
• +72bytes + 4-8bytes/item (если растить)
• объект: 12bytes + 4bytes/property
• замыкание: 36bytes
• контекст: 24bytes + 4bytes/var
52
* стоимость вV8 (Google Chrome)
Данные
bower.io/search
53
File
~2,5 Мб
Object
~9,0 Мб
JSON.parse
Создание моделей
54
Решение 0 полей 10 полей
new basis.data.Object() 240 240
basis.entity.Type() 440 840
new Backbone.Model() 920 1 480
Ember.Object.create() 1 040 1 600
10 000 экземпляров, Кб
Разные задачи, разные
решения
55
• Произвольные поля • Строгий набор полей
• Вычисляемые поля
• Индекс
• Нормализация значений
• Defaults
• Rollback
• ...
basis.entity.Entitybasis.data.Object
дешево и сердито дороже, но с плюшками
Event listeners
56
Фреймворк 1 событие 2 события 3 события
Basis 240 240 240
Backbone 1 520 2 860 3 840
Ember 5 480 6 520 7 560
10 000 экземпляров, Кб
Итого
57
Решение 10 полей, 1 listener overhead
basis.data 480 5 %
basis.entity 1 080 12 %
Backbone 3 000 33 %
Ember 7 080 79 %
10 000 экземпляров, Кб
А если пойти дальше...
58
Интерполяция
59
Решение 1 000 10 000 100 000
basis.data 0, 05 0,5 5
basis.entity 0,1 1 10
Backbone 0,3 3 30
Ember 0,7 7 70
10 полей и 1 listener, Мб
Вывод №1
О памяти, можно не заботиться
когда меньше 10 000 моделей
60
Вывод №2
Но при больших количествах
объектов, расход памяти
является серьезной проблемой
61
Меньше overhead –
больше полезной нагрузки
62
Время
63
Парсинг данных
bower.io/search
64
JSON.parse
~22 мс
Создание моделей
65
Фреймворк 0 полей 3 поля 10 полей 20 полей
basis.data 2 2 2 2
basis.entity
22
6
36
14
105
22
183
35
Backbone.Model 66 123 238 489
Ember.Object 73 128 201 355
10 000 экземпляров, мс
Event listeners
66
Решение 1 событие 2 события 3 события
Basis ~ 0 ~ 0 ~ 0
Backbone 20 29 38
Ember 49 68 89
10 000 экземпляров, мс
Итого
67
Решение 10 полей, 1 listener overhead
basis.data 2 9 %
basis.entity 22 100 %
Backbone 248 1127 %
Ember 250 1136 %
10 000 экземпляров, мс
А если пойти дальше...
68
Интерполяция
69
Решение 1 000 10 000 100 000
basis.data ~ 0 2 20
basis.entity 2 22 220
Backbone 25 248 2 480
Ember 25 250 2 500
10 полей и 1 listener, мс
Это базовое время –
быстрее не поедет
70
Вывод №3
Задачи можно решать
по-разному, но не все решения
хорошо масштабируются
71
72
Вывод №4
Возможно создавать быстрые и
дешевые интерфейсы к данным
Зачем нужны такие оценки?
73
Чтобы понимать с каким
количеством мы можем работать,
не причиняя браузеру страдания
74
Есть задачи, где требуется
работать с большим
количеством моделей
75
Пример:
Rates & AvailabilityView
76
Rates & AvailabilityView
Кастомизированный Excel со сложной
логикой, специальными функциями и
возможностью редактирования
77
78
Клиент для отелей
Rates &
Availability
View
Масштабы бедствия
79
до 219 000 ячеек
Структура отеля
до 300 строк
(и растет)
Даты
до 730 колонок
(1-2 года)
×
Как это работает сейчас
• По структуре отеля генерируем HTML,
вставляем в документ
• document.getElementById() ➞ элемент ячейки
• Запрашиваем данные – месяц/запрос
• Данные – транформируем, создаем модели,
настраиваем связи с другими моделями
• Добавляем интерактив – обработчики событий и т.д.
80
Знакомо, не правда ли?
81
В цифрах
• ~5 000 строк vanilla JavaScript, минимум jQuery
• ~3,5 с чистое время генерации таблицы
(в худшем случае десятки секунд)
• ~50 Мб памяти
(в худшем случае 100-300 Мб)
82
Одна из быстрых реализаций с
таким подходом
83
Время и память
зависят от размеров
и количества данных
84
Новый функционал
Например, не так давно +2 строки/тариф
85
Средний отель
• 25 тарифов × 2 новые строки
• = 50 новых строк
• = ~18 000 новых ячеек (для года)
• = время увеличилось с 3 сек до 3,6 сек (на 16%)
86
Нужно чтобы было быстрее...
87
Новая реализация:
Динамический вьюпорт
88
Рисуем только то,
что попадает в зону видимости
89
Видимая ячейка
90
View
Model (merge)
DataAllotmentDate
x y
В видимой области
от 200 до 2000 ячеек
91
Повышенные требования
Быстрое создание представлений
Быстрая вставка и удаление представлений
Переиспользование представлений
Быстрое создание моделей
Ленивое создание и рассчеты
Малое потребление памяти
92
Повышенные требования
Быстрое создание представлений
Быстрая вставка и удаление представлений
Переиспользование представлений
Быстрое создание моделей
Ленивое создание и рассчеты
Малое потребление памяти
93
Ленивая обработка данных
94
• JSON.parse
• создание моделей
• расчеты
• GC
• JSON.parse
• добавление в кеш
Отложенное созданиеНемедленное создание
В месяце от 1 000 до 10 000 ячеек
40-250мс/месяц 5-25мс/месяц
Ленивая обработка данных
94
Отложенное созданиеНемедленное создание
В месяце от 1 000 до 10 000 ячеек
40-250мс/месяц 5-25мс/месяц
x12 ~3,0 сек
x24 ~6,0 сек
x12 ~0,3 сек
x24 ~0,6 сек
Ленивое создание моделей
Создаются только те модели,
что попадают во вьюпорт и те,
от которых зависит вид
отображаемых ячеек
95
?
Расчет стиля ячейки
96
rate
Расчет стиля ячейки
96
rate
occupancy
occupancy
...
Расчет стиля ячейки
96
rate
price
price
occupancy
occupancy
...
Расчет стиля ячейки
96
rate
price
price
room
occupancy
occupancy
...
Расчет стиля ячейки
96
rate
price
price
fixed_count
flexible_count
...
room
occupancy
occupancy
...
Расчет стиля ячейки
96
rate
price
price
disable_fixed
disable_flexible
...
fixed_count
flexible_count
...
room
occupancy
occupancy
...
Расчет стиля ячейки
96
rate
price
price
disable_fixed
disable_flexible
...
fixed_count
flexible_count
...
room
occupancy
occupancy
...
Старт
Время:
~1 секунда
без учета сетевых издержек
Память:
6-10 Мб
с постепенным увеличением
при смещении вьюпорта
97
Scroll
98
3 вьюпорта
99
При сдвиге вычиcляется дельта,
какие ячейки нужно удалить
и какие добавить
100
В среднем
при сдвиге вьюпорта
101
А могут замениться и все ячейки вьюпорта
удаляется
20-250 ячеек
добавляется
20-250 ячеек
Основные операции
• Создание моделей
• Создание представлений ячеек
• Вставка и удаление ячеек
• Рассчеты
102
Основные операции
• Создание моделей
• Создание представлений ячеек
• Вставка и удаление ячеек
• Рассчеты
102
Нужно
уклыдываться
в 16мс
Scroll
Сейчас: 30-40 FPS
103
Scroll
Сейчас: 30-40 FPS
103
Цель: 50-60 FPS
Scroll
Сейчас: 30-40 FPS
103
Цель: 50-60 FPS
Кажется,
вполне достижимо
Demo
104
Бонус трек
пример простой реализации
tinyurl.com/table-scroll
105
Заключение
106
Не использовать
DOM для хранения данных
107
Модель ≠ представление
108
данных может быть
гораздо больше
Возможно делать
дешевые интерфейсы
к данным
109
Можно работать
с сотнями тысяч моделей
на client-side
110
111
Главное, делать это аккуратно ;)
Вопросы?
112
Роман Дворнов
@rdvornov
rdvornov@gmail.com
basis.js
basisjs.com
github.com/basisjs

More Related Content

PDF
Быстро о быстром
Roman Dvornov
 
PDF
Баба Яга против!
Roman Dvornov
 
PDF
DOM-шаблонизаторы – не только "быстро"
Roman Dvornov
 
PDF
Как построить DOM
Roman Dvornov
 
PDF
Жизнь в изоляции
Roman Dvornov
 
PDF
Basis.js – «под капотом»
Roman Dvornov
 
PDF
SPA инструменты
Roman Dvornov
 
PDF
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Roman Dvornov
 
Быстро о быстром
Roman Dvornov
 
Баба Яга против!
Roman Dvornov
 
DOM-шаблонизаторы – не только "быстро"
Roman Dvornov
 
Как построить DOM
Roman Dvornov
 
Жизнь в изоляции
Roman Dvornov
 
Basis.js – «под капотом»
Roman Dvornov
 
SPA инструменты
Roman Dvornov
 
Basis.js - почему я не бросил разрабатывать свой фреймворк (extended)
Roman Dvornov
 

What's hot (20)

PDF
Инструменты разные нужны, инструменты разные важны
Roman Dvornov
 
PDF
Компонентный подход: скучно, неинтересно, бесперспективно
Roman Dvornov
 
PDF
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
 
PDF
Опыт разработки эффективного SPA
Eugene Abrosimov
 
PDF
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Roman Dvornov
 
PDF
Инструментируй это
Roman Dvornov
 
PDF
JavaScript Базовый. Занятие 07.
Igor Shkulipa
 
PDF
Как сделать ваш JavaScript быстрее
Roman Dvornov
 
PDF
CSS глазами машин
Roman Dvornov
 
PDF
Парсим CSS
Roman Dvornov
 
PDF
CSSO — минимизируем CSS
Roman Dvornov
 
PDF
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
PDF
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 
PDF
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Ontico
 
PPTX
Chef @DevWeb
Alex Chistyakov
 
PDF
ДАМП 2015 Екатеринбург
Alexey Ivanov
 
PDF
Парсим CSS: performance tips & tricks
Roman Dvornov
 
PPT
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
IT-Portfolio
 
PDF
CSSO – история ускорения
Roman Dvornov
 
Инструменты разные нужны, инструменты разные важны
Roman Dvornov
 
Компонентный подход: скучно, неинтересно, бесперспективно
Roman Dvornov
 
basis.js - почему я не бросил разрабатывать свой фреймворк
Roman Dvornov
 
Опыт разработки эффективного SPA
Eugene Abrosimov
 
Unit-тестирование скриншотами: преодолеваем звуковой барьер
Roman Dvornov
 
Инструментируй это
Roman Dvornov
 
JavaScript Базовый. Занятие 07.
Igor Shkulipa
 
Как сделать ваш JavaScript быстрее
Roman Dvornov
 
CSS глазами машин
Roman Dvornov
 
Парсим CSS
Roman Dvornov
 
CSSO — минимизируем CSS
Roman Dvornov
 
Внутреннее устройство и оптимизация бандла webpack
Alexey Ivanov
 
CSS-в-JS, HTML-в-JS, ВСЁ-в-JS. Все гораздо проще, когда всё вокруг JavaScript
Alexey Ivanov
 
Радости и гадости регрессионного тестирования вёрстки / Алексей Малейков (HTM...
Ontico
 
Chef @DevWeb
Alex Chistyakov
 
ДАМП 2015 Екатеринбург
Alexey Ivanov
 
Парсим CSS: performance tips & tricks
Roman Dvornov
 
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
IT-Portfolio
 
CSSO – история ускорения
Roman Dvornov
 
Ad

Viewers also liked (15)

PPSX
Сотрудничество
Venera Rakhimova
 
PDF
Мультиварка REDMOND RMC-M4525
multivarki
 
PDF
CSS parsing: performance tips & tricks
Roman Dvornov
 
PDF
CSSO – compress CSS (english version)
Roman Dvornov
 
PDF
Карточный домик
Roman Dvornov
 
PDF
Remote (dev)tools своими руками
Roman Dvornov
 
PDF
WUD2013: Юрий Ветров — Унификация, vol. 1. Фреймворк Mail.Ru для мобильного веба
Yury Vetrov
 
PDF
Презентация стартапа
Презентациус
 
PDF
Шаблон презентации о Компании в PowerPoint (B2B)
Слайдстор
 
PDF
It All Adds Up! Engaging Math Strategies, Web Tools, and Apps
Shelly Sanchez Terrell
 
PDF
GAME ON! Integrating Games and Simulations in the Classroom
Brian Housand
 
PDF
Design Your Career 2018
Slides That Rock
 
PDF
The What If Technique presented by Motivate Design
Motivate Design
 
PDF
What Would Steve Do? 10 Lessons from the World's Most Captivating Presenters
HubSpot
 
PDF
How Google Works
Eric Schmidt
 
Сотрудничество
Venera Rakhimova
 
Мультиварка REDMOND RMC-M4525
multivarki
 
CSS parsing: performance tips & tricks
Roman Dvornov
 
CSSO – compress CSS (english version)
Roman Dvornov
 
Карточный домик
Roman Dvornov
 
Remote (dev)tools своими руками
Roman Dvornov
 
WUD2013: Юрий Ветров — Унификация, vol. 1. Фреймворк Mail.Ru для мобильного веба
Yury Vetrov
 
Презентация стартапа
Презентациус
 
Шаблон презентации о Компании в PowerPoint (B2B)
Слайдстор
 
It All Adds Up! Engaging Math Strategies, Web Tools, and Apps
Shelly Sanchez Terrell
 
GAME ON! Integrating Games and Simulations in the Classroom
Brian Housand
 
Design Your Career 2018
Slides That Rock
 
The What If Technique presented by Motivate Design
Motivate Design
 
What Would Steve Do? 10 Lessons from the World's Most Captivating Presenters
HubSpot
 
How Google Works
Eric Schmidt
 
Ad

Similar to Не бойся, это всего лишь данные... просто их много (20)

PPTX
Ускорение сайта на стороне клиента
yulia_k
 
PPTX
Ускорение сайта на стороне клиента
rusonyx
 
PDF
Purely practical data structures
Евгений Лазин
 
PDF
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
FProg
 
PPT
Lobanov_Cloud-Comput..
webhostingguy
 
PDF
Android: Как написать приложение, которое не тормозит
Elena Kotina
 
PDF
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Tatyanazaxarova
 
PDF
Ускорение client-side для мобильных устройств. Failoverconf 2014
Yuri Ustinov
 
PDF
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Yandex
 
PDF
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Yandex
 
PPTX
Developing highload servers with Java
Andrei Pangin
 
PDF
Эффективные Алгоритмы Поиска Подобных Объектов Для Терабайтов Данных
SPb_Data_Science
 
PDF
Alexander Serbul ITEM 2018
ITEM
 
PDF
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Yandex
 
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Ontico
 
PDF
Как мы храним 75 млн пользователей (Денис Бирюков)
Ontico
 
PPTX
04 net saturday eugene sukhikh ''the basic performance questions''
DneprCiklumEvents
 
PPTX
04 net saturday eugene sukhikh ''the basic performance questions''
DneprCiklumEvents
 
PPTX
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
Ontico
 
PPTX
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
Ускорение сайта на стороне клиента
yulia_k
 
Ускорение сайта на стороне клиента
rusonyx
 
Purely practical data structures
Евгений Лазин
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
FProg
 
Lobanov_Cloud-Comput..
webhostingguy
 
Android: Как написать приложение, которое не тормозит
Elena Kotina
 
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ Library
Tatyanazaxarova
 
Ускорение client-side для мобильных устройств. Failoverconf 2014
Yuri Ustinov
 
Алексей Андросов "Архитектура фронтенда Яндекс.Почты"
Yandex
 
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Yandex
 
Developing highload servers with Java
Andrei Pangin
 
Эффективные Алгоритмы Поиска Подобных Объектов Для Терабайтов Данных
SPb_Data_Science
 
Alexander Serbul ITEM 2018
ITEM
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Yandex
 
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Ontico
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Ontico
 
04 net saturday eugene sukhikh ''the basic performance questions''
DneprCiklumEvents
 
04 net saturday eugene sukhikh ''the basic performance questions''
DneprCiklumEvents
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
Ontico
 
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 

Не бойся, это всего лишь данные... просто их много