performance em javascript

104
Performance em javascript

Upload: guilherme-serrano

Post on 14-Dec-2014

425 views

Category:

Technology


1 download

DESCRIPTION

Aprenda como mensurar e executar testes de performance no Javascript. Quais são as boas práticas para performance no javascript e como escrever código para ter aplicações mais velozes no client-side? Algumas dicas para mensurar, exemplos sobre reflow e repaint e testes de performance de operações básicas, iterações, arrays, regex, seletores e também da biblioteca jQuery.

TRANSCRIPT

Page 1: Performance em javascript

Performance em javascript

Page 2: Performance em javascript

Guilherme Bortolin Serrano

Bacharel em Desenho Industrial (ULBRA)Pós graduado em Gestão Empreendedora (SENAC)EmpreendedorProgramador / Hacker

Page 3: Performance em javascript
Page 4: Performance em javascript

Experiências

Page 5: Performance em javascript
Page 6: Performance em javascript
Page 7: Performance em javascript
Page 8: Performance em javascript
Page 9: Performance em javascript
Page 10: Performance em javascript
Page 11: Performance em javascript
Page 12: Performance em javascript
Page 13: Performance em javascript

OTIMIZAÇÃO

Page 14: Performance em javascript

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil

"Tony Hoare ~1975

Nós devemos desconsiderar ajustes para pequenas performance, digamos que em 97% do tempo a otimização

prematura é a raiz de todo o mal

Page 15: Performance em javascript

A raiz de todo o mal!

A raiz de todo o mal!

Page 16: Performance em javascript

Não otimizeprematuramente

Page 17: Performance em javascript

Qual o custo da otimização?

- Aumento de tempo de desenvolvimento inicial - Pode prejudicar a leitura do código:

- Mais difícil fazer novas implementações- Mais difícil dar manutenção no código

(principalmente em equipe)

Page 18: Performance em javascript

Por outro lado...

Page 19: Performance em javascript

Pensar cedo em otimização

- Melhora planejamento para otimizações futuras- Evita "surpresas" no lançamento do produto em

produção

Page 20: Performance em javascript

Porque otimizar?

Page 21: Performance em javascript

https://blog.kissmetrics.com/loading-time/?wide=1

Abandono de página = prejuízo

Page 22: Performance em javascript

Ganhos reais

- Experiência do usuário- + felicidade- + vendas- + ROI- + pageviews- - abandono de página / ação

- Outros "menos importantes"- Economia de banda, redução de custo com servidor...

Page 23: Performance em javascript

Mensurandoperformance

Page 24: Performance em javascript

"Uso Internet Explorer

em uma VM"

@chrisb

Page 25: Performance em javascript

JSPerf

http://jsperf.com/

Page 26: Performance em javascript

debug / console

Page 27: Performance em javascript

Chrome DEV Tools

https://developer.chrome.com/devtools/docs/cpu-profiling

Page 28: Performance em javascript

Otimizando!

Page 29: Performance em javascript
Page 30: Performance em javascript

DOM

Page 31: Performance em javascript

Evite repaint e reflow

DOM

Page 32: Performance em javascript

RepaintO repaint acontece quando mudanças são feitas em elementos que alteram a visualização mas não afetam o layout.

- Outline- Visibility- Background color- etc

* A Opera diz que o repaint é custoso pois a visibilidade de todos os elementos da árvore do DOM.

DOM

Page 33: Performance em javascript

ReflowO reflow acontece quando existem mudanças no layout da página (largura, padding, posicionamento) e a alteração de um elemento se extende aos childs e aos parents.

DOM

Page 34: Performance em javascript

a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se extende aos childs e aos parents - a alteração de um elemento se

Page 35: Performance em javascript

O que causa um reflow?

Resize da janelaAlteração de fonteAdicionar ou remover uma stylesheetAlteração de conteúdos (como o usuário escrever em um input…)Ativação de pseudoclass como :hoverManipulação do atributo classeManipulação do DOMCalcular offsetWidth ou offsetHeightDefinir um atributo de uma propriedade de estilo

Praticamente tudo que é legal fazer com JS.

DOM

Page 36: Performance em javascript

<body><div class=”error”>

<h4>My Module</h4><p><strong>Error:</strong>Description of the error…</p><h5>Corrective action required:</h5><ol>

<li>Step one</li><li>Step two</li>

</ol></div></body>

DOM

Page 37: Performance em javascript

<body><div class=”error”>

<h4>My Module</h4><p><strong>Error:</strong>Description of the error…</p><h5>Corrective action required:</h5><ol>

<li>Step one</li><li>Step two</li>

</ol></div></body>

DOMreflow

Page 38: Performance em javascript

<body><div class=”error”>

<h4>My Module</h4> <p><strong>Error:</strong>Description of the error…</p>

<h5>Corrective action required:</h5><ol>

<li>Step one</li><li>Step two</li>

</ol></div></body>

DOMreflow -> child

Page 39: Performance em javascript

<body><div class=”error”><h4>My Module</h4><p><strong>Error:</strong>Description of the error…</p><h5>Corrective action required:</h5><ol>

<li>Step one</li><li>Step two</li>

</ol></div></body>

DOMreflow -> parent

Page 40: Performance em javascript

<body><div class=”error”> <h4>My Module</h4><p><strong>Error:</strong>Description of the error…</p><h5>Corrective action required:</h5><ol>

<li>Step one</li><li>Step two</li>

</ol></div></body>

DOMreflow -> child

Page 41: Performance em javascript

<body><div class=”error”> <h4>My Module</h4><p><strong>Error:</strong>Description of the error…</p><h5>Corrective action required:</h5><ol>

<li>Step one</li><li>Step two</li>

</ol></div></body>

DOMreflow -> child

Page 42: Performance em javascript

Uma captura raraem imagem de um

reflow

DOM

Page 43: Performance em javascript
Page 45: Performance em javascript

Altere o DOM somente

quando for necessário

DOM

Page 46: Performance em javascript

Evitando manipulação do DOMfor (var i = 0; i < 100; i++) { document.getElementById("teste").innerHTML += "<span>" + i + "</span>";}

// Manipula o DOM a cada iteração :(

DOM

Page 47: Performance em javascript

Evitando manipulação do DOMvar myList = "";for (var i = 0; i < 100; i++) { myList += "<span>" + i + "</span>";}document.getElementById("teste").innerHTML = myList;

// Concatena uma string e manipula o DOM apenas uma vez :)

DOM

Page 48: Performance em javascript

Evitando cálculo de offsetvar div = document.getElementById("to-measure"), lis = document.getElementsByTagName('li'), i, len;

for (i = 0, len = lis.length; i < len; i++) { lis[i].style.width = div.offsetWidth + 'px';}

DOM

http://jsbin.com/aqavin/2/quiet

Page 49: Performance em javascript

Evitando cálculo de offsetvar div = document.getElementById("to-measure"), lis = document.getElementsByTagName('li'), i, len;for (i = 0, len = lis.length; i < len; i++) { lis[i].style.width = div.offsetWidth + 'px';}

DOM

http://jsbin.com/aqavin/2/quiet

reflow, reflow, reflow...

Page 50: Performance em javascript

Evitando cálculo de offsetvar div = document.getElementById("to-measure"), lis = document.getElementsByTagName('li'), widthToSet = div.offsetWidth, i, len;

for (i = 0, len = lis.length; i < len; i++) { lis[i].style.width = widthToSet + 'px';}

DOM

http://jsbin.com/aqavin/2/quiet

Page 51: Performance em javascript

Evitando cálculo de offsetvar div = document.getElementById("to-measure"), lis = document.getElementsByTagName('li'), widthToSet = div.offsetWidth, i, len;

for (i = 0, len = lis.length; i < len; i++) { lis[i].style.width = widthToSet + 'px';}

DOM

http://jsbin.com/aqavin/2/quiet

cache do offsetWidth

sem reflow :)

Page 52: Performance em javascript

TESTE!

Page 53: Performance em javascript

Literals

var arr = [];var obj = {};

var arr = new Array();var obj = new Object();

Page 54: Performance em javascript

Literals

var arr = [];var obj = {};

var arr = new Array();var obj = new Object();

Page 55: Performance em javascript

Function vs Inline*function a(x,y){ return x + y;}

a("4", "5");

"4" + "5"

* sempre considere o custo de manutenção / leitura

Page 56: Performance em javascript

Function vs Inline*

a("4", "5"); "4" + "5"

Page 57: Performance em javascript

Function vs Inline*

a("4", "5"); "4" + "5"

Questione: essa diferença compensa manutenção do código?

Page 58: Performance em javascript

Regular Expression

Page 59: Performance em javascript

var texts = [ "foo bar foo bar foo bar", "foobarfoobarfoobar", "foo asdfasdfasdf bar" ]

REGEX

Page 60: Performance em javascript

var texts = [ "foo bar foo bar foo bar", "foobarfoobarfoobar", "foo asdfasdfasdf bar" ]

REGEX

cache normalmente é uma boa ideia

Page 61: Performance em javascript

REGEX

Page 62: Performance em javascript

REGEX

Page 63: Performance em javascript

exec(); VS match(); VS test();

var oRegex = /(\{\:([0-9])\:\})/;var str = "asdf{:1:}jal{:2:}sdk{:3:}fj_8{:4:}kjdk";

REGEX

Page 64: Performance em javascript

REGEX

Page 65: Performance em javascript

Array

Page 66: Performance em javascript

for(); function indexOfFor(ar,v){ for (var i = 0,l=ar.length; i < l; i++) { if (ar[i] === v) { return i; } } return -1; }

Array

Page 67: Performance em javascript

for(); while(); function indexOfFor(ar,v){ for (var i = 0,l=ar.length; i < l; i++) { if (ar[i] === v) { return i; } } return -1; }

function indexOfWhile(ar,v){ var i=-1, imax = ar.length; while (++i < imax) { if (ar[i] === v) return i; } return -1; }

Array

Page 68: Performance em javascript

for(); while(); indexOf(); function indexOfFor(ar,v){ for (var i = 0,l=ar.length; i < l; i++) { if (ar[i] === v) { return i; } } return -1; }

function indexOf(ar,v){ return ar.indexOf(v); }

function indexOfWhile(ar,v){ var i=-1, imax = ar.length; while (++i < imax) { if (ar[i] === v) return i; } return -1; }

Array

Page 69: Performance em javascript

Array

Page 70: Performance em javascript

Como limpar um array?

Array

Page 71: Performance em javascript

Array

Page 72: Performance em javascript

Iteraçõesfor (i = 0; i < arr.length; i++) { // calcula o length a cada iteração}

// bad, bad, no donut for you! :(

Array

Page 73: Performance em javascript

Iterações com cachefor (i = 0; i < arr.length; i++) { // calcula o length a cada iteração}

// bad, bad, no donut for you! :(

for (i = 0, len = arr.length; i < len; i++) { // calcula o length uma vez e cacheia // a variável "len"}

// :D

Array

Page 74: Performance em javascript

Math

Page 75: Performance em javascript

parseInt();

parseInt(12.9);

Math

Page 76: Performance em javascript

parseInt(); Math.floor();

parseInt(12.9); Math.floor(12.9);

Math

Page 77: Performance em javascript

BitwiseBitwise

BitwiseBitwise

Bitwise

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

~~

Math

Page 78: Performance em javascript
Page 79: Performance em javascript

parseInt(); Math.floor();

~~

parseInt(12.9);

~~(1 * "12.9");

// :(:// NOT NOT (coisa estranha, magia negra, etc)

Math.floor(12.9);

Math

Page 80: Performance em javascript

Math

Page 81: Performance em javascript

~~ (NOT NOT)

var r = 1234567890.99~~(r)// 1234567890

var r = 12345678901.99~~(r)// -539222987// ?

Math

Page 82: Performance em javascript

jQuery

Page 83: Performance em javascript

A raiz de todo o mal!

A raiz de todo o mal!

Page 84: Performance em javascript

getElementById();

document.getElemntById('teste');

jQuery

Page 85: Performance em javascript

getElementById(); $('#');document.getElemntById('teste'); $('#teste');

jQuery

Page 86: Performance em javascript

getElementById(); $('#');document.getElemntById('teste');

395x mais rápido!

$('#teste');

jQuery

Page 87: Performance em javascript

jQuery

Page 88: Performance em javascript

$('.') vs querySelectorjQuery

Page 89: Performance em javascript

$('.') vs querySelectorjQuery

Page 90: Performance em javascript

$('.') vs querySelectorjQuery

suporte

Page 91: Performance em javascript

$('.') vs querySelectorjQuery

Mais de 14 vezes mais rápido

Page 92: Performance em javascript

.empty() VS .html('').empty(); .html('');

jQuery

Page 93: Performance em javascript

.empty() VS .html('').empty();

2 x mais rápido

.html('');

:(

jQuery

Page 94: Performance em javascript

Ações no seletor$('.lorem').class('cached');$('.lorem').html('cached');$('.lorem').click(function(){ console.log('click');});

jQuery

Page 95: Performance em javascript

Ações no seletor - cache$('.lorem').class('cached');$('.lorem').html('cached');$('.lorem').click(function(){ console.log('click');});

// :(

var el = $('.lorem');

el.class('cached');el.html('cached');el.click(function(){ console.log('click');});

// RAZOÁVEL

jQuery

Page 96: Performance em javascript

Ações no seletorchain

$('.lorem') .class('cached') .html('cached') .click(function(){ console.log('click'); });

jQuery

Page 97: Performance em javascript

jQuery

Page 98: Performance em javascript

find()div>(ul#list>(li.item1+li.item2))

divul#list

li.item1li.item2

ul#list2lili

jQuery

Page 99: Performance em javascript

find()

$test1 = $('#list li.test1');$test2 = $('#list li.test2');

jQuery

Page 100: Performance em javascript

find()

$test1 = $('#list li.test1');$test2 = $('#list li.test2');

$test1 = $('.test1');$test2 = $('.test2');

// Se tem classe repetida pode perder o sentido / performar pior

jQuery

Page 101: Performance em javascript

find()

$list = $('#list');$test1 = $list.find('li.test1');$test2 = $list.find('li.test2');

$test1 = $('#list li.test1');$test2 = $('#list li.test2');

$test1 = $('.test1');$test2 = $('.test2');

// Se tem classe repetida pode perder o sentido / performar pior

jQuery

Page 102: Performance em javascript

find()

$list = $('#list');$test1 = $list.find('li.test1');$test2 = $list.find('li.test2');

$test1 = $('#list li.test1');$test2 = $('#list li.test2');

$test1 = $('.test1');$test2 = $('.test2');

// Se tem classe repetida pode perder o sentido / performar pior

$list = $('#list');$test1 = $list.find('.test1');$test2 = $list.find('.test1');

jQuery

Page 103: Performance em javascript

jQuery

13x

Page 104: Performance em javascript

OBRIGADO!

@[email protected]

hacklab.club