Как сделать ваш javascript быстрее

115
Как сделать ваш JavaScript быстрее Роман Дворнов Avito

Upload: roman-dvornov

Post on 07-Jan-2017

1.065 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: Как сделать ваш JavaScript быстрее

Как сделать ваш JavaScript быстрее

Роман Дворнов Avito

Page 2: Как сделать ваш JavaScript быстрее

Руководитель фронтенда в Avito

Основной интерес – SPA

Open source:basis.js, CSSO, component-inspector, csstree и другие

Page 3: Как сделать ваш JavaScript быстрее

Вводная

Page 4: Как сделать ваш JavaScript быстрее

Производительность Frontend'а

• Не всегда проблема (и так быстро)

• Если работает медленно, не всегда это связано с JavaScript (особенно в браузере)

• Доклад про те ситуации, когда проблема действительно в JavaScript

4

Page 5: Как сделать ваш JavaScript быстрее

Как сделать JavaScript быстрее?

5

Page 6: Как сделать ваш JavaScript быстрее

Простого ответа нет• Нужно разбирать каждый случай отдельно

• Пара символов или строк могут изменить производительность в разы или даже в десятки раз

• На производительность могут влиять внешние факторы

• Тема производительности JavaScript все еще не стабильна – все меняется

• Тема огромная, многие аспекты требуют предварительной подготовки

6

Page 7: Как сделать ваш JavaScript быстрее

В общем случае, нужно понимать как работают JavaScript движки,

что фактически происходит под капотом, принимать меры там, где это нужно

7

Page 8: Как сделать ваш JavaScript быстрее

О чем поговорим• Заблуждения

• Новое в JavaScript

• Внешнее влияние на производительность

• Что можно найти под капотом

8

Page 9: Как сделать ваш JavaScript быстрее

Мифы и легенды

Page 10: Как сделать ваш JavaScript быстрее

Разработчики руководствуются своими представлениями о том, что быстро и что нет – часто эти

представления не верны

10

Page 11: Как сделать ваш JavaScript быстрее

4 Javascript Optimisations you should know

11

leftshift.io/4-javascript-optimisations-you-should-know

Пример вредной статьи

4 апреля 2014

Page 12: Как сделать ваш JavaScript быстрее

12

Page 13: Как сделать ваш JavaScript быстрее

Вредный совет #1

hasOwnProperty быстрее switch

Page 14: Как сделать ваш JavaScript быстрее

switch vs. hasOwnProperty

14

function testSwitch(quality){    switch (quality) {        case "Hard Working":        case "Honest":        case "Intelligent":        case "Team player":            return true;        default:            return false;    }}

var o = {    'Hard Working': true,    'Honest': true,    'Intelligent': true,    'Team player': true};

function testHOP(quality) {    return o.hasOwnProperty(quality)}

Нужно перебирать все варианты – медленно

Быстрее и гибче

Page 15: Как сделать ваш JavaScript быстрее

switch vs. hasOwnProperty

15

testSwitch: 4 mstestHOP: 40 ms

Простой тест показывает обратное

Page 16: Как сделать ваш JavaScript быстрее

Значит switch быстрее hasOwnProperty?

• Не всегда, в данном случае – да

• В общем случае (в режиме интерпретатора) обычно медленнее

• Время switch в примере обусловлено его оптимизацией при компиляции

• В то же время, hasOwnProperty не оптимизируется

16

Page 17: Как сделать ваш JavaScript быстрее

Намеренно деоптимизируем

17

try/catch не дает функции оптимизироваться (V8)

function testSwitch(quality){ try{}catch(e){}    switch (quality) {        case "Hard Working":        case "Honest":        case "Intelligent":        case "Team player":            return true;        default:            return false;    }}

var o = {    'Hard Working': true,    'Honest': true,    'Intelligent': true,    'Team player': true};

function testHOP(quality) { try{}catch(e){}    return o.hasOwnProperty(quality)}

Page 18: Как сделать ваш JavaScript быстрее

Результаты

18

testSwitch: 70 mstestHOP: 42 ms

С оптимизацией

testSwitch: 4 mstestHOP: 40 ms

Без оптимизации (try/catch)

Page 19: Как сделать ваш JavaScript быстрее

Выводы

• switch работает быстро, если оптимизируется

• другой код может помешать оптимизации

• могут быть дополнительные ограничения: например, ранее V8 не оптимизировал switch если вариантов (case) более 128

19

Page 20: Как сделать ваш JavaScript быстрее

Вредный совет #2

for..in vs. Object.keys()

Page 21: Как сделать ваш JavaScript быстрее

for..in vs. Object.keys()

21

for (var key in object) {    // do something}

for..in – плохо, потому что перебираются как собственные ключи так и ключи в цепочке

прототипов

Page 22: Как сделать ваш JavaScript быстрее

for..in vs. Object.keys()

22

for (var key in object) {    if (object.hasOwnProperty(key)) {        // do something    }}

лучше проверять, что ключ является собственным, но это дополнительная проверка

Page 23: Как сделать ваш JavaScript быстрее

for..in vs. Object.keys()

23

var keys = Object.keys(object);

for (var i = 0; i < keys.length; i++){    // do something}

Object.keys() возвращает только собственные ключи – это лучше и быстрее

Page 24: Как сделать ваш JavaScript быстрее

for..in vs. Object.keys()

24

forIn: 170 msforInHOP: 56 msobjectKeys: 188 ms

Результаты теста

jsfiddle.net/rdvornov/veeorm09/

Page 25: Как сделать ваш JavaScript быстрее

Разбираемся

25

for..in действительно перебирает как собственные ключи так и ключи в цепочке прототипов – это сложно оптимизировать и

стоит избегать

for (var key in object) {    // do something}

Page 26: Как сделать ваш JavaScript быстрее

Разбираемся

26

дополнительная проверка позволяет оптимизатору распознать паттерн и сгенерировать код, который

не будет трогать цепочку прототипов

for (var key in object) {    if (object.hasOwnProperty(key)) {        // do something    }}

Page 27: Как сделать ваш JavaScript быстрее

Разбираемся

27

да, Object.keys() перебирает только собственные ключи и это быстро, но в результате создается временный массив, который нужно итерировать,

к тому же это создает нагрузку на GC

var keys = Object.keys(object);

for (var i = 0; i < keys.length; i++){    // do something}

Page 28: Как сделать ваш JavaScript быстрее

for..in vs. Object.key()

28

forIn: 170 msforInHOP: 56 msobjectKeys: 188 ms

С оптимизацией

forIn: 202 msforInHOP: 232 msobjectKeys: 244 ms

Без оптимизации

Page 29: Как сделать ваш JavaScript быстрее

Выводы

• for..in в общем случае немного быстрее

• hasOwnProperty проверка может приводить к лучшей оптимизации for..in

• Object.keys() может и отрабатывает быстрее, но генерирует мусор и не оптимизируется

29

Page 30: Как сделать ваш JavaScript быстрее

Вредный совет #3

Оптимизация циклов

Page 31: Как сделать ваш JavaScript быстрее

Оптимизация циклов

31

for (var i = 0; i < array.length; i++) {    // do something}

обычный цикл, который чем то не угодил

Page 32: Как сделать ваш JavaScript быстрее

Оптимизация циклов

32

for (var i = 0, len = array.length; i < len; i++) {    // do something}

нужно его ускорить, закешировав длину массива, но и это не самый быстрый вариант

Page 33: Как сделать ваш JavaScript быстрее

Оптимизация циклов

33

var i = array.length;while (i--) {    //do something}

while цикл быстрее for

Page 34: Как сделать ваш JavaScript быстрее

Тест автора статьи

34

var arr = [];for (var i = 0; i <= 1000000; i++) {    arr.push(i);}

console.time("slowLoop");for (var k = 0, len = arr.length; k < len; k++) {    // do something}console.timeEnd("slowLoop");

console.time("fastLoop");var j = arr.length;while (j--) {    // do something}console.timeEnd("fastLoop");

Page 35: Как сделать ваш JavaScript быстрее

Результаты теста

35

slowLoop: 3.47 msfastLoop: 2.52 ms

Page 36: Как сделать ваш JavaScript быстрее

На самом деле…

• В последних браузерах "slowLoop" обычно быстрее "fastLoop"

• Временные интервалы малы, в таких случаях велика погрешность

• Сам по себе тест неверный

36

Page 37: Как сделать ваш JavaScript быстрее

Разбираемся

37

var arr = [];for (var i = 0; i <= 1000000; i++) {    arr.push(i);}

console.time("slowLoop");for (var k = 0, len = arr.length; k < len; k++) {    // do something}console.timeEnd("slowLoop");

console.time("fastLoop");var j = arr.length;while (j--) {    // do something}console.timeEnd("fastLoop");

Изначально код не оптимизуется – если код

выполняется лишь раз, нет смысла оптимизировать

Page 38: Как сделать ваш JavaScript быстрее

Разбираемся

38

var arr = [];for (var i = 0; i <= 1000000; i++) {    arr.push(i);}

console.time("slowLoop");for (var k = 0, len = arr.length; k < len; k++) {    // do something}console.timeEnd("slowLoop");

console.time("fastLoop");var j = arr.length;while (j--) {    // do something}console.timeEnd("fastLoop");

Тело цикла выполняется много раз и могло было бы

оптимизироваться, но здесь оно пустое

Page 39: Как сделать ваш JavaScript быстрее

Разбираемся

39

var arr = [];for (var i = 0; i <= 1000000; i++) {    arr.push(i);}

console.time("slowLoop");for (var k = 0, len = arr.length; k < len; k++) {    // do something}console.timeEnd("slowLoop");

console.time("fastLoop");var j = arr.length;while (j--) {    // do something}console.timeEnd("fastLoop");

По сути сравнивается время выполнения этих

инструкций

Page 40: Как сделать ваш JavaScript быстрее

Выполним тест несколько раз

40

function test(){    console.time("slowLoop");    for (var k = 0, len = arr.length; k < len; k++) {        // do something    }    console.timeEnd("slowLoop");    console.time("fastLoop");    var j = arr.length;    while (j--) {        // do something;    }    console.timeEnd("fastLoop");}

test();test();test();

Page 41: Как сделать ваш JavaScript быстрее

Результаты

41

slowLoop: 3.00 msfastLoop: 2.07 msslowLoop: 0.85 msfastLoop: 1.38 msslowLoop: 1.14 msfastLoop: 1.57 ms

Page 42: Как сделать ваш JavaScript быстрее

Результаты

41

slowLoop: 3.00 msfastLoop: 2.07 msslowLoop: 0.85 msfastLoop: 1.38 msslowLoop: 1.14 msfastLoop: 1.57 ms

Первое исполнение без оптимизации

Последующие с оптимизацией

Page 43: Как сделать ваш JavaScript быстрее

Промежуточные выводы

• Код оптимизируется по мере разогрева

• Простые функции оптимизируются на втором-третьем вызове

• Оптимизированный код может поменять картину

42

Page 44: Как сделать ваш JavaScript быстрее

Так как же быстрее всего?

43

Page 45: Как сделать ваш JavaScript быстрее

Поменяем подход к тестированию

44

function test(x){  loop {      x++;  }  return x;}

console.time('test');for (var i = 0, res = 0; i < 100; i++) {    res += test(i);}console.timeEnd('test');

• каждую функцию выполняем несколько раз – даем возможность оптимизациям

• добавляем одинаковую полезную нагрузку – увеличиваем время выполнения уменьшаем влияние погрешности

• избегаем dead code elimination

Page 46: Как сделать ваш JavaScript быстрее

Результаты

45

for: 155msforCache: 156mswhile: 183ms

С оптимизацией

for: 494msforCache: 460mswhile: 605ms

Без оптимизации

Page 47: Как сделать ваш JavaScript быстрее

Выводы

• while быстрее for – миф из прошлого

• для современных движков обычно нет необходимости кешировать значения в циклах

• на скорость цикла больше влияет оптимизация чем форма записи

46

Page 48: Как сделать ваш JavaScript быстрее

Подводим итоги

Page 49: Как сделать ваш JavaScript быстрее

Выводы• Гипотезы нужно подтверждать тестами

• Часто код работает не так, как мы думаем

• Не стоит жить мифами, движки эволюционируют – нужно освежать свои знания

• Микробенчмарки – зло, если создаются без понимания работы движков

48

Page 50: Как сделать ваш JavaScript быстрее

Советы• Не стоит доверять всему, что пишут в интернетах или говорят в докладах, перепроверяйте

• Наиболее точная информация в публикациях разработчиков браузеров, движков и независимых авторов, объясняющих почему именно так

• Смотрите на дату публикации, даже верные утверждения могут устареть

49

Page 51: Как сделать ваш JavaScript быстрее

Новое не всегда хорошо

Page 52: Как сделать ваш JavaScript быстрее

JavaScript развивается – появляются новые удобные конструкции, но не стоит

забывать о производительности

51

Page 53: Как сделать ваш JavaScript быстрее

Поддержка со стороны движка не означает, что это работает

быстро

52

Page 54: Как сделать ваш JavaScript быстрее

Правда жизни• Часто новые возможности реализуют по принципу

"чтобы работало" – без учета производительности

• Новые конструкции могут не оптимизироваться и мешать оптимизации сопряженного кода

• Некоторые возможности из ES5/ES6/etc в принципе не могут быть оптимизированыи работать быстро

53

Page 55: Как сделать ваш JavaScript быстрее

var vs. let/const

Page 56: Как сделать ваш JavaScript быстрее

Сегодня стало "модно" везде заменять var на let или const

55

Page 57: Как сделать ваш JavaScript быстрее

Однако, в V8 (Chrome/node.js) let/const медленнее var в 2 раза,

в остальных движках время одинаковое

56

jsperf.com/let-vs-var-performance/50

Page 58: Как сделать ваш JavaScript быстрее

– Вячеслав Егоров

“... [const] это все-таки неизменяемая привязка переменной к значению ...

С другой стороны виртуальная машина может и должна бы использовать это самое свойство неизменяемости ...

V8 не использует, к сожалению.”

57

habrahabr.ru/company/jugru/blog/301040/#comment_9622474

Page 59: Как сделать ваш JavaScript быстрее

Promise

Page 60: Как сделать ваш JavaScript быстрее

Два года назад, я решил узнать насколько мой полифил для Promise медленней нативной

реализации…

59

github.com/lahmatiy/es6-promise-polyfill

Page 61: Как сделать ваш JavaScript быстрее

Тест №1

60

var a = []; // чтобы инстансы не разрушались/собирались GCvar t = performance.now();

for (var i = 0; i < 10000; i++)  a.push(new Promise(function(){}));  console.log(performance.now() - t);

Page 62: Как сделать ваш JavaScript быстрее

Тест №2

61

var a = []; // чтобы инстансы не разрушались/собирались GCvar t = performance.now();

for (var i = 0; i < 10000; i++)  a.push(new Promise(function(r, rj){ a.push(r, rj) }));  console.log(performance.now() - t);

Page 63: Как сделать ваш JavaScript быстрее

Promise – 2 года назад

62

gist.github.com/lahmatiy/d4d6316418fe349537dc

Test 1 Test 2Native Polyfill Native Polyfill

Chrome 35 105 15 154 18

Firefox 30 90 17 113 25

IE11 – 5 – 6

время в миллисекундах

Page 64: Как сделать ваш JavaScript быстрее

Promise – сегодня

63

Test 1 Test 2Native Polyfill Native Polyfill

Chrome 54 12.5 5.8 13.7 8

Firefox 49 101 31 119.2 43.1

Edge 14 12.7 25.7 22.2 40.2

Safari 10 3.7 1.8 4.3 2.3

время в миллисекундах

Page 65: Как сделать ваш JavaScript быстрее

Полифил Promise (не самый быстрый) по прежнему быстрее

нативных реализаций почти во всех движках/браузерах

64

Page 66: Как сделать ваш JavaScript быстрее

Это афектит все Promise-based API и новые фичи вроде async/await

65

Page 67: Как сделать ваш JavaScript быстрее

Я попытался еще ускорить полифил Promise, например,

используя Function#bind вместо замыканий…

66

Page 68: Как сделать ваш JavaScript быстрее

closure vs. Function#bind

Page 69: Как сделать ваш JavaScript быстрее

По идее Function#bind должен быть дешевле (быстрее)

68

Page 70: Как сделать ваш JavaScript быстрее

Результаты – 2 года назад

69

gist.github.com/lahmatiy/3d97ee23f3d89941970f

Closure Function#bind

Chrome 35 14 28

Firefox 30 10.3 17.1

IE11 9.3 2.9

время в миллисекундах

Page 71: Как сделать ваш JavaScript быстрее

Результаты – сегодня

70

Closure Function#bind

Chrome 54 2.5 0.8

Firefox 49 3.8 5.7

Edge 14 5.1 4.2

Safari 10 1.0 4.0

время в миллисекундах

Page 72: Как сделать ваш JavaScript быстрее

Метод Function#bind все еще медленней (не оптимизирован) замыканий в ряде движков

71

Page 73: Как сделать ваш JavaScript быстрее

Транспиляция

Page 74: Как сделать ваш JavaScript быстрее

Транспиляция (например, ES6→ES5) уменьшает возможность влиять на код

и его производительность

73

Page 75: Как сделать ваш JavaScript быстрее

Транспиляция может оказывать как положительный эффект, например,

оптимизация кода на основе статического анализа

74

Page 76: Как сделать ваш JavaScript быстрее

Возможно и негативное влияние, когда сгенерированный код не может быть оптимизирован – в таких случаях

стоит переписать код на ES5/ES3

75

Page 77: Как сделать ваш JavaScript быстрее

Подводим итоги

Page 78: Как сделать ваш JavaScript быстрее

Выводы• Новое не всегда работает быстро

• Нужно время, чтобы в движки добавили новые оптимизации и что-то заработало быстро

77

Page 79: Как сделать ваш JavaScript быстрее

Советы• Все новое в JavaScript стоит проверять – работает ли быстро, оптимизируется ли

• Стоит читать блоги/release notes разработчиков движков и браузеров, в них пишут о добавлении новых оптимизаций

• Критические к производительности места стоит писать на ES3/ES5

78

Page 80: Как сделать ваш JavaScript быстрее

Беда может прийти откуда не ждешь

Page 81: Как сделать ваш JavaScript быстрее

Даже если сам JavaScript работает быстро, внешние факторы могут значительно

влиять на его производительность

80

Page 82: Как сделать ваш JavaScript быстрее

Внешние API

Page 83: Как сделать ваш JavaScript быстрее

JavaScript код взаимодествует с внешними системами и API – таймеры, DOM, файловая

система, сеть и т.д.

82

Page 84: Как сделать ваш JavaScript быстрее

Это не часть JavaScript, однако API часто синхронное и время его вызова прибавляется ко

времени выполнения JavaScript

83

Page 85: Как сделать ваш JavaScript быстрее

Пример: DOM

84

function doSomething(el, viewport) {    el.style.width = viewport.offsetWidth + 'px';    el.style.height = viewport.offsetHeight + 'px';}

С точки зрения JavaScript, здесь все просто и нечего оптимизировать

Page 86: Как сделать ваш JavaScript быстрее

Пример: DOM

85

function doSomething(el, viewport) {    el.style.width = viewport.offsetWidth + 'px';    el.style.height = viewport.offsetHeight + 'px';}

Но для второго чтения потребуется сделать пересчет layout'а (дорогая операция), так как

до этого был изменен DOM

Page 87: Как сделать ваш JavaScript быстрее

Пример: DOM

86

function doSomething(el, viewport) {    var width = viewport.offsetWidth;    var height = viewport.offsetHeight;    el.style.width = width + 'px';    el.style.height = height + 'px';}

В этом случае сначала делается чтение, потом запись – код не тригирует пересчет layout'а

Page 88: Как сделать ваш JavaScript быстрее

Стоит помнить• Время выполнения внешних API добавляется к JavaScript и останавливает его выполнение

• Не все, что доступно в JavaScript является его частью

• Внешние API могут приводить к побочным явлениям (side effect) затратным по времени

87

Page 89: Как сделать ваш JavaScript быстрее

Память

Page 90: Как сделать ваш JavaScript быстрее

Говоря о производительности JavaScript, часто забывают

о важном компоненте – памяти

89

Page 91: Как сделать ваш JavaScript быстрее

Выделение памяти

90

var array = [];for (var i = 0; i < 1000; i++) {    array.push(i);}

Плохо – может приводить к релокации фрагментов памяти (массивы хранятся

одним фрагментом)

Page 92: Как сделать ваш JavaScript быстрее

Выделение памяти

91

var array = new Array(1000);for (var i = 0; i < 1000; i++) {    array[i] = i;}

Лучше – может помочь избежать релокацию, так как сразу выделится нужно кол-во памяти

Page 93: Как сделать ваш JavaScript быстрее

Так же можно использовать структуры данных, позволяющие избегать релокации,

например, TypedArray или списки

92

Подробнее в докладе: Парсим CSS: performance tips & tricks

Page 94: Как сделать ваш JavaScript быстрее

GC может все испортить

93

Page 95: Как сделать ваш JavaScript быстрее

94

Пример

Page 96: Как сделать ваш JavaScript быстрее

Влияние GC

95

> node --trace-gc test.js...[91494:0x102001000] 374 ms: Scavenge 35.3 (56.9) -> 35.0 (57.9) MB, 30.0 / 0.0 ms [allocation failure].[91494:0x102001000] 443 ms: Scavenge 38.2 (59.9) -> 38.1 (74.9) MB, 46.2 / 0.0 ms [allocation failure].===== run #1 152 ms===== run #2 63 ms===== run #3 44 ms...===== run #7 58[91494:0x102001000] 896 ms: Scavenge 135.2 (159.9) -> 135.0 (160.9) MB, 31.5 / 0.0 ms [allocation failure].[91494:0x102001000] 965 ms: Scavenge 140.0 (163.9) -> 140.0 (178.9) MB, 59.2 / 0.0 ms [allocation failure].===== run #8 131 ms===== run #9 43 ms===== run #10 46 ms

Page 97: Как сделать ваш JavaScript быстрее

Эволюция GC• молодая и старая память

• инкрементальная сборка мусора

• параллельная сборка мусора

96

Page 98: Как сделать ваш JavaScript быстрее

Простые советы• Используем меньше памяти – быстрее

• Генерируем меньше мусора – быстрее

• Нужно понимать как происходит выделение памяти и сборка мусора (GC)

97

Page 99: Как сделать ваш JavaScript быстрее

Лезем под капот

Page 100: Как сделать ваш JavaScript быстрее

Чтобы работать над ускорением JavaScript, важно понимать как устроены и работают JavaScript

движки

99

Page 101: Как сделать ваш JavaScript быстрее

С чем стоит разобраться• hidden class

• monomorphic, polymorphic, megamorphic

• inline cache

• function inlining

• dead code elimination

• tenuring

• ...

100

Page 102: Как сделать ваш JavaScript быстрее

Хорошее начало – блог и доклады Вячеслава Егорова

mrale.ph/blog/

101

Page 103: Как сделать ваш JavaScript быстрее

Блоги браузеров – ценный источник информации

102

Page 104: Как сделать ваш JavaScript быстрее

Помимо этого• Как работает железо (процессор, память – регистры, адресация)

• Иметь преставление что такое машинный код

• Структуры данных (стек, etc)

• Как представляются структуры данных в низкоуровневых языках (массивы, строки)

103

Page 105: Как сделать ваш JavaScript быстрее

Самый верный способ узнать, что на самом деле выполняет

движок – посмотреть внутреннее представление

104

Page 106: Как сделать ваш JavaScript быстрее

105

node --trace-hydrogen \ --trace-phase=Z \ --trace-deopt \ --code-comments \ --hydrogen-track-positions \ --redirect-code-traces \ --redirect-code-traces-to=code.asm \ --trace_hydrogen_file=code.cfg \ --print-opt-code \ your-script.js

Получаем данные о работе кода

Page 107: Как сделать ваш JavaScript быстрее

106

mrale.ph/irhydra/2/

code.asm code.cfg

Page 108: Как сделать ваш JavaScript быстрее
Page 109: Как сделать ваш JavaScript быстрее

Заключение

Page 110: Как сделать ваш JavaScript быстрее

Без понимания того, как устроены JavaScript движки

крайне сложно писать производительный код

109

Page 111: Как сделать ваш JavaScript быстрее

Тема объемна – ее не постичь за короткое время, потому

нужно понемногу в ней копаться

110

Page 112: Как сделать ваш JavaScript быстрее

Врем

я сж

атия

CSS

(600

Kb)

500 ms

1 000 ms

1 500 ms

2 000 ms

2 500 ms

3 000 ms

3 500 ms

4 000 ms

4 500 ms

5 000 ms

5 500 ms

6 000 ms

Версия CSSO

1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 2.0

1 050 msclean-css

Оно того стоит: изменение скорости CSSO

csso500 ms

cssnano23 250 ms

Page 113: Как сделать ваш JavaScript быстрее

112

CSSTree: 7 msMensch: 31 msCSSOM: 36 msPostCSS: 38 msRework: 81 msPostCSS Full: 100 msGonzales: 175 msStylecow: 176 msGonzales PE: 214 msParserLib: 414 ms

Оно того стоит: CSSTree

github.com/postcss/benchmark

Разбор bootstrap.css v3.3.7 (146Kb)

Парсер CSSTree появился в результате многочисленного рефакторинга Gonzales

Подробнее в докладе: Парсим CSS: performance tips & tricks

Page 114: Как сделать ваш JavaScript быстрее

Ищите объяснения, почему что-то работает быстро или медленно – тогда вы сами сможете ответить

на вопрос как сделать ваш JavaScript быстрее

113

Page 115: Как сделать ваш JavaScript быстрее

Роман Дворнов @rdvornov

github.com/lahmatiy [email protected]

Спасибо!