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

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

  • Upload
    basisjs

  • View
    1.820

  • Download
    0

Embed Size (px)

DESCRIPTION

За последние 15 лет веб сильно изменился и ускорился. Но большинство по-прежнему боится большого количества данных и сложной логики на клиенте. Потому что "тормозит". Я хочу сломать стереотипы и показать, как начать делать крутые штуки на client-side. Тысячи и сотни тысяч объектов, разные типы, зависимые вычисляемые свойства, агрегация, множество вариантов отображения. Все это в вашем браузере. Без тормозов, регистраций, смс.

Citation preview

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

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