61
РАЗГОНЯЕМ JS Антон Плешивцев aviasales.ru

Повышение конверсии через оптимизацию JS

  • Upload
    ant-pl

  • View
    1.986

  • Download
    2

Embed Size (px)

DESCRIPTION

Слайды с конференции Devconf 2014. Рассказывается, как производительность влияет на конверсию, приводится 8 тонкостей языка, которые нужно знать, чтобы писать самый быстрый код из возможного.

Citation preview

Page 1: Повышение конверсии через оптимизацию JS

РАЗГОНЯЕМ JSАнтон Плешивцев

aviasales.ru

Page 2: Повышение конверсии через оптимизацию JS

МЕТАПОИСК

Page 3: Повышение конверсии через оптимизацию JS

МЕТАПОИСК

Page 4: Повышение конверсии через оптимизацию JS

МЕТАПОИСК

Page 5: Повышение конверсии через оптимизацию JS

МЕТАПОИСК

Page 6: Повышение конверсии через оптимизацию JS

МЕТАПОИСК

Page 7: Повышение конверсии через оптимизацию JS

ОКНО ДЖОХАРИ

Известное продавцу

Неизвестное продавцу

Известное клиенту Открытое Слепое пятно

Неизвестное клиенту Скрытое Неизвестное

Page 8: Повышение конверсии через оптимизацию JS

ПРОФИЛИРОВАНИЕ

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

• Ручное

• Инструментальное

Page 9: Повышение конверсии через оптимизацию JS

СТАТИСТИЧЕСКОЕ

Page 10: Повышение конверсии через оптимизацию JS

СОБЫТИЙНОЕ

Page 11: Повышение конверсии через оптимизацию JS

РУЧНОЕ

t = +new Date(); code_to_measure(); time = +new Date() - t;

Page 12: Повышение конверсии через оптимизацию JS

РУЧНОЕ, НО УДОБНОЕ

function profile(func){ ! var wrapper = function(){ var start = +new Date(); var result = func.apply(null, arguments); console.log(func.name, +new Date() - start, "ms"); return result; }; ! return wrapper; }

Page 13: Повышение конверсии через оптимизацию JS

РУЧНОЕ, НО УДОБНОЕ

code_to_measure = profile(code_to_measure); !code_to_measure(); > code_to_measure 112ms

Page 14: Повышение конверсии через оптимизацию JS
Page 15: Повышение конверсии через оптимизацию JS
Page 16: Повышение конверсии через оптимизацию JS
Page 17: Повышение конверсии через оптимизацию JS
Page 18: Повышение конверсии через оптимизацию JS

КОНВЕРСИЯ

Январь Февраль Март Апрель Май

Page 19: Повышение конверсии через оптимизацию JS

TIP #1вызов функций

Page 20: Повышение конверсии через оптимизацию JS

!var start = +new Date(); var result = func.apply(null, arguments); console.log(func.name, +new Date() - start, "ms");

Page 21: Повышение конверсии через оптимизацию JS

switch (args.length) { case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return; }

Page 22: Повышение конверсии через оптимизацию JS

APPLY & CALL

0

12500000

25000000

37500000

50000000

Apply Call

(количество операций в секунду, больше - лучше)

Page 23: Повышение конверсии через оптимизацию JS

APPLY & CALL & DIRECT

0

17500000

35000000

52500000

70000000

Apply Call Direct

(количество операций в секунду, больше - лучше)

Page 24: Повышение конверсии через оптимизацию JS

TIP #2быстрые таймауты

Page 25: Повышение конверсии через оптимизацию JS

setTimeout(function test(){ !

… !

}, 0)

Page 26: Повышение конверсии через оптимизацию JS

function setZeroTimeout(fn) { timeouts.push(fn); window.postMessage("zero-timeout-message", "*"); } !window.addEventListener("message", function handleMessage(event) { if (event.source == window && event.data == messageName) { //zero timeout } } , true)

http://dbaron.org/log/20100309-faster-timeouts

Page 27: Повышение конверсии через оптимизацию JS

TIP #3почему тормозит Underscore

Page 28: Повышение конверсии через оптимизацию JS

_.map = _.collect = function(obj, iterator, context) { var results = []; ! if (obj == null) return results; ! if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); ! each(obj, function(value, index, list) { results.push(iterator.call(context, value, index, list)); ! }); return results; };

Page 29: Повышение конверсии через оптимизацию JS

map = function(obj, iterator, context) { if (nativeMap) { map = function(obj, iterator, context){ return obj.map(iterator); } } else { map = function(obj, iterator, context){ var results = []; each(obj, function(value, index, list) { results.push(iterator.call(context, value, index, list)); }); return results; } } return map(obj, iterator, context); };

Page 30: Повышение конверсии через оптимизацию JS

0

3,75

7,5

11,25

15

_.map map

(время работы в среднем, меньше - лучше)

Page 31: Повышение конверсии через оптимизацию JS

0

4

8

12

16

_.map map lodash.map

(время работы в среднем, меньше - лучше)

Page 32: Повышение конверсии через оптимизацию JS

TIP #4самый быстрый цикл

Page 33: Повышение конверсии через оптимизацию JS

CLASSIC FOR

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

Page 34: Повышение конверсии через оптимизацию JS

CLASSIC FOR WITH LENGTH CACHE

for (var i = 0, len = arr.length; i < len; ++i) { arr[i]; };

Page 35: Повышение конверсии через оптимизацию JS

REVERSE WHILE

var i = arr.length; while (i--) { arr[i]; };

Page 36: Повышение конверсии через оптимизацию JS

WHILE IMITATING FOR

var i = 0, len = arr.length; while (i < len) { arr[i]; i++; };

Page 37: Повышение конверсии через оптимизацию JS

0

775

1550

2325

3100

classic for for with cache reverse while while imitating for

Firefox

(количество операций в секунду, больше - лучше)

Page 38: Повышение конверсии через оптимизацию JS

160

167,5

175

182,5

190

classic for for with cache reverse while while imitating for

Chrome

Page 39: Повышение конверсии через оптимизацию JS

0

800

1600

2400

3200

classic for for with cache reverse while while imitating for

Firefox Chrome

Page 40: Повышение конверсии через оптимизацию JS

ПОБЕДИТЕЛЬ

var i = 0, len = arr.length; while (i < len) { arr[i]; i++; };

Page 41: Повышение конверсии через оптимизацию JS

TIP #5быстрый доступ к ОП

Page 42: Повышение конверсии через оптимизацию JS

function(){ document.getElementById('sidebar'); document.getElementById('collections'); document.getElementById('logo'); }

Page 43: Повышение конверсии через оптимизацию JS

function(){ var d = document; d.getElementById('sidebar'); d.getElementById('collections'); d.getElementById('logo'); }

Page 44: Повышение конверсии через оптимизацию JS

0

350

700

1050

1400

До После

(время на цикле 1М, меньше - лучше)

Page 45: Повышение конверсии через оптимизацию JS
Page 46: Повышение конверсии через оптимизацию JS

TIP #6работа с DOM

Page 47: Повышение конверсии через оптимизацию JS

JQUERY STRING

iframe = $("<iframe src='javascript:false' name='theiframe'>");

Page 48: Повышение конверсии через оптимизацию JS

JQUERY CHAIN

iframe = $(‘<iframe>’).attr({ name: 'theiframe', src: ‘javascript:false' })

Page 49: Повышение конверсии через оптимизацию JS

NATIVE JS

iframe = document.createElement('iframe'); iframe.name = 'theiframe'; iframe.src = 'javascript:false';

Page 50: Повышение конверсии через оптимизацию JS

FUNCTION

iframe = createElement('iframe', { name: 'theiframe', src: ‘javascript:false' });

Page 51: Повышение конверсии через оптимизацию JS

0

125000

250000

375000

500000

jQuery string jQuery chain Native js Function

(количество операций в секунду, больше - лучше)

Page 52: Повышение конверсии через оптимизацию JS

TIP #7самый быстрый фреймворк

Page 53: Повышение конверсии через оптимизацию JS

0

750

1500

2250

3000

React Angular Mithril vuejs

Page 54: Повышение конверсии через оптимизацию JS

TIP #8self vs bind

Page 55: Повышение конверсии через оптимизацию JS

var self = this; check(function(){ self.ok(); })

Page 56: Повышение конверсии через оптимизацию JS

check(function(){ this.ok(); }).bind(this);

Page 57: Повышение конверсии через оптимизацию JS

0

7500000

15000000

22500000

30000000

Bind self

(количество операций в секунду, больше - лучше)

Page 58: Повышение конверсии через оптимизацию JS

ПРОФИЛИРУЙТЕ

Page 59: Повышение конверсии через оптимизацию JS

ЗАМЕРЯЙТЕ

Page 60: Повышение конверсии через оптимизацию JS

ИЗУЧАЙТЕ

Page 61: Повышение конверсии через оптимизацию JS

ABOUT

АНТОН ПЛЕШИВЦЕВ !

twitter.com/allaud github.com/allaud

https://www.facebook.com/ant.pl.3 !!!!!!

aviasales.ru