Top Banner
Не бойся, это всего лишь данные... просто их много Роман Дворнов Ostrovok.ru
134

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

Dec 16, 2014

Download

Technology

basisjs

За последние 15 лет веб сильно изменился и ускорился. Но большинство по-прежнему боится большого количества данных и сложной логики на клиенте. Потому что "тормозит".
Я хочу сломать стереотипы и показать, как начать делать крутые штуки на client-side. Тысячи и сотни тысяч объектов, разные типы, зависимые вычисляемые свойства, агрегация, множество вариантов отображения. Все это в вашем браузере. Без тормозов, регистраций, смс.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Не бойся, это всего лишь данные... просто их много

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

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

О себе

• Работаю в Ostrovok.ru

•Автор фреймворка basis.js

2

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

Данные

3

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

Когда говорят про данные на client-side,

чаще всего, подразумевают объекты и их наборы(модели и коллекции)

4

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

Сегодня есть опыт, разнообразные библиотеки, быстрые браузеры, мощные API...

5

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

... но многие по-прежнему скептически относятся к сложным вычислениям и системам на client-side

6

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

Client-side глазами скептиков...7

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

Все ли так плохо?

8

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

Хороший «плохой» пример

9

Или как заставить браузер страдать

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

bower.io/search10

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

~10 000 модулей~2,5 Мб JSON

11

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

~10 000 модулей~2,5 Мб JSON

~8 сек браузер "висит"!12

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

ААааа!!!!.. Все пропало!... Нужно грузить постранично...

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

14

Постойте, не так быстро...

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

Почему?

15

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

Что делает скрипт

16

• загружает JSON (массив объектов)

• генерирует 4 небольших списка

• генерирует таблицу на ~10 000 строк

• отдает таблицу компоненту, который разбивает её на страницы и удаляет все строки, кроме первых десяти

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

17

Timeline – Что делает браузер

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

Что делает браузер

• javascript ~2,85 сек

• парсиг html (из шаблонов) ~0,75 сек

• расчет стилей ~1,6 сек

• layout (~200 000 узлов) ~2.8 сек

• еще несколько секунд асинхронно (по 100) "индексируются" строки для поиска

18

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

А можно быстрее?

19

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

Можно!

• генерация представлений ~0,04 сек

• применение данных ~0,15* сек

20

* и можно быстрее

lahmatiy.github.io/bower-search

github.com/lahmatiy/bower-search

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

21

Timeline – Применение данныхтолько JavaScript – ничего лишнего

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

Чак одобряет22

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

Хорошие новости:Переделали – теперь работает быстро

23

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

Вывод:

Дело не в количестве данных,а в неэффективном подходе

24

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

Проблемасовременного фронтенда

25

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

Многие веб-разработчики думают через призму jQuery-like подходов, размышляют про данные через представление (верстку)

26

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

27

Пара примеровПо мотивам «старого» bower.io/search

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

28

+

=

$('#components') .find('.created time, .updated time') .timeago();

Разметка ради разметки

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

29

Невидимая ячейка, ее innerHTML используется для поиска

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

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;};

Получение значений для поиска

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

В общем случае

31

Data

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

В общем случае

31

HTMLData

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

В общем случае

31

HTML DOMData

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

В общем случае

31

Data*

HTML DOMData

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

В общем случае

31

Data*

HTML DOMData

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

В общем случае

31

Data*

HTML DOMData

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

В общем случае

31

Data*

HTML DOMData

WTF?!

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

В общем случае

31

Data*

HTML DOMData

WTF?!Данные в

исходном виде

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

Фактически, DOM используется как хранилище данных

32

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

И это самое медленное, что можно придумать

33

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

8,0 с vs. 0,2 с

34

40 : 1

Цифры говорят сами за себя

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

Не используйтеDOM для хранения данных!

35

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

А как надо-то?

36

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

Работа с данными – вне представлений, в абстрактном слое

37

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

Задача представлений –отражать состояние данных

38

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

Идеальный вариант

39

Data

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

Идеальный вариант

39

DOMData

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

Идеальный вариант

39

DOMData

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

Идеальный вариант

39

DOMData

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

Helpers Helpers

Идеальный вариант + хелперы

40

Data DOM

Viewbindings

...

ModelCollection

...

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

Хелперы упрощают разработку, но добавляют overhead

41

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

Быстрая работа с DOM

42

Наиболее перспективное направление DOM-based templates

Фреймворки: React, Ractive, Meteor, Basis.js...

Доклад «Как построить DOM»tinyurl.com/build-dom

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

Быстрая работа с данными

43

Практически никто об этом не думает :(

Якобы основная проблема –рендеринг

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

Модель ≠ представление

44

Данных может быть гораздо больше, чем представлений

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

bower.io/search

45

10 000+ модулей

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

bower.io/search

45

10 000+ модулей

кастомные выборки, мгновенная фильтрация и сортировка

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

bower.io/search

45

10 000+ модулей

без участия сервера

кастомные выборки, мгновенная фильтрация и сортировка

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

Демо блог – 5 000 постов

46

показываемпостранично

Имея все постыгенерируемоблако тегови архив на клиенте

tinyurl.com/basis-blog

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

Каковы пределы?

47

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

С каким количеством моделеймы можем работать?

48

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

1 00010 000100 000

1 000 000???

49

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

Конечные ресурсы:память и время

50

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

Память

51

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

Все чего-то стоит• массив: 16bytes

• +12bytes + 4bytes/item (для литералов)

• +72bytes + 4-8bytes/item (если растить)

• объект: 12bytes + 4bytes/property

• замыкание: 36bytes

• контекст: 24bytes + 4bytes/var

52

* стоимость в V8 (Google Chrome)

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

Данныеbower.io/search

53

File

~2,5 МбObject

~9,0 Мб

JSON.parse

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

Создание моделей

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 экземпляров, Кб

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

Разные задачи, разные решения

55

• Произвольные поля • Строгий набор полей

• Вычисляемые поля

• Индекс

• Нормализация значений

• Defaults

• Rollback

• ...

basis.entity.Entitybasis.data.Objectдешево и сердито дороже, но с плюшками

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

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 экземпляров, Кб

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

Итого

57

Решение 10 полей, 1 listener overhead

basis.data 480 5 %

basis.entity 1 080 12 %

Backbone 3 000 33 %

Ember 7 080 79 %

10 000 экземпляров, Кб

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

А если пойти дальше...

58

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

Интерполяция

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, Мб

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

Вывод №1

О памяти, можно не заботиться когда меньше 10 000 моделей

60

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

Вывод №2

Но при больших количествах объектов, расход памяти

является серьезной проблемой

61

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

Меньше overhead – больше полезной нагрузки

62

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

Время

63

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

Парсинг данныхbower.io/search

64

JSON.parse

~22 мс

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

Создание моделей

65

Фреймворк 0 полей 3 поля 10 полей 20 полей

basis.data 2 2 2 2

basis.entity 226

3614

10522

18335

Backbone.Model 66 123 238 489

Ember.Object 73 128 201 355

10 000 экземпляров, мс

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

Event listeners

66

Решение 1 событие 2 события 3 события

Basis ~ 0 ~ 0 ~ 0

Backbone 20 29 38

Ember 49 68 89

10 000 экземпляров, мс

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

Итого

67

Решение 10 полей, 1 listener overhead

basis.data 2 9 %

basis.entity 22 100 %

Backbone 248 1127 %

Ember 250 1136 %

10 000 экземпляров, мс

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

А если пойти дальше...

68

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

Интерполяция

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, мс

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

Это базовое время –быстрее не поедет

70

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

Вывод №3

Задачи можно решать по-разному, но не все решения хорошо масштабируются

71

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

72

Вывод №4

Возможно создавать быстрые и дешевые интерфейсы к данным

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

Зачем нужны такие оценки?

73

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

Чтобы понимать с какимколичеством мы можем работать, не причиняя браузеру страдания

74

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

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

75

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

Пример:

Rates & Availability View

76

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

Rates & Availability View

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

77

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

78

Клиент для отелей

Rates & Availability

View

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

Масштабы бедствия

79

до 219 000 ячеек

Структура отеля

до 300 строк(и растет)

Даты

до 730 колонок(1-2 года)

×

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

Как это работает сейчас

• По структуре отеля генерируем HTML, вставляем в документ

• document.getElementById() ➞ элемент ячейки

• Запрашиваем данные – месяц/запрос

• Данные – транформируем, создаем модели, настраиваем связи с другими моделями

• Добавляем интерактив – обработчики событий и т.д.

80

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

Знакомо, не правда ли?

81

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

В цифрах

• ~5 000 строк vanilla JavaScript, минимум jQuery

• ~3,5 с чистое время генерации таблицы(в худшем случае десятки секунд)

• ~50 Мб памяти(в худшем случае 100-300 Мб)

82

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

Одна из быстрых реализаций с таким подходом

83

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

Время и память зависят от размерови количества данных

84

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

Новый функционалНапример, не так давно +2 строки/тариф

85

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

Средний отель

• 25 тарифов × 2 новые строки

• = 50 новых строк

• = ~18 000 новых ячеек (для года)

• = время увеличилось с 3 сек до 3,6 сек (на 16%)

86

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

Нужно чтобы было быстрее...

87

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

Новая реализация:

Динамический вьюпорт

88

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

Рисуем только то, что попадает в зону видимости

89

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

Видимая ячейка

90

View

Model (merge)

DataAllotmentDate

x y

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

В видимой областиот 200 до 2000 ячеек

91

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

Повышенные требования

Быстрое создание представлений

Быстрая вставка и удаление представлений

Переиспользование представлений

Быстрое создание моделей

Ленивое создание и рассчеты

Малое потребление памяти

92

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

Повышенные требования

Быстрое создание представлений

Быстрая вставка и удаление представлений

Переиспользование представлений

Быстрое создание моделей

Ленивое создание и рассчеты

Малое потребление памяти

93

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

Ленивая обработка данных

94

• JSON.parse

• создание моделей

• расчеты

• GC

• JSON.parse

• добавление в кеш

Отложенное созданиеНемедленное создание

В месяце от 1 000 до 10 000 ячеек

40-250мс/месяц 5-25мс/месяц

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

Ленивая обработка данных

94

Отложенное созданиеНемедленное создание

В месяце от 1 000 до 10 000 ячеек

40-250мс/месяц 5-25мс/месяц

x12 ~3,0 секx24 ~6,0 сек

x12 ~0,3 секx24 ~0,6 сек

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

Ленивое создание моделей

Создаются только те модели, что попадают во вьюпорт и те, от которых зависит вид отображаемых ячеек

95

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

?

Расчет стиля ячейки

96

rate

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

Расчет стиля ячейки

96

rate

occupancy

occupancy

...

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

Расчет стиля ячейки

96

rate

price

price

occupancy

occupancy

...

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

Расчет стиля ячейки

96

rate

price

price

room

occupancy

occupancy

...

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

Расчет стиля ячейки

96

rate

price

price

fixed_countflexible_count...

room

occupancy

occupancy

...

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

Расчет стиля ячейки

96

rate

price

price

disable_fixeddisable_flexible...

fixed_countflexible_count...

room

occupancy

occupancy

...

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

Расчет стиля ячейки

96

rate

price

price

disable_fixeddisable_flexible...

fixed_countflexible_count...

room

occupancy

occupancy

...

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

Старт

Время:

~1 секундабез учета сетевых издержек

Память:

6-10 Мбс постепенным увеличением при смещении вьюпорта

97

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

Scroll

98

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

3 вьюпорта99

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

При сдвиге вычиcляется дельта, какие ячейки нужно удалить

и какие добавить

100

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

В среднемпри сдвиге вьюпорта

101

А могут замениться и все ячейки вьюпорта

удаляется20-250 ячеек

добавляется20-250 ячеек

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

Основные операции

• Создание моделей• Создание представлений ячеек• Вставка и удаление ячеек• Рассчеты

102

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

Основные операции

• Создание моделей• Создание представлений ячеек• Вставка и удаление ячеек• Рассчеты

102

Нужно уклыдываться в 16мс

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

Scroll

Сейчас: 30-40 FPS

103

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

Scroll

Сейчас: 30-40 FPS

103

Цель: 50-60 FPS

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

Scroll

Сейчас: 30-40 FPS

103

Цель: 50-60 FPS

Кажется,вполне достижимо

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

Demo

104

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

Бонус трек

пример простой реализации

tinyurl.com/table-scroll

105

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

Заключение

106

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

Не использовать DOM для хранения данных

107

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

Модель ≠ представление

108

данных может быть гораздо больше

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

Возможно делать дешевые интерфейсы

к данным

109

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

Можно работатьс сотнями тысяч моделей

на client-side

110

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

111

Главное, делать это аккуратно ;)