Node.js - Dica de performance - tamanho da função

Galera faz tempinho que eu repasso essa dica então para facilitar eu estou criando esse post.

Uma dica muito simples mas muito eficaz, porém eu não tenho muitos problemas por atomizar minhas funções e seguir o conceito de responsabiidade única, estamos falando do tamanho de uma função.

Claro você deve imaginar que isso deve impactar a memória, correto?

Nopz

- Ué mas então impacta no que tio Suissa?

Vou lhe responder com código, pode ser fio(a)?

Este artigo é basado nesse aqui, por isso estou usando os mesmos exemplos.

exemplo1.js:

'use strict';

function add(x, y) {  
    // Addition is one of the four elementary,
    // mathematical operation of arithmetic with the other being subtraction,
    // multiplication and division. The addition of two whole numbers is the total
    // amount of those quantitiy combined. For example in the picture on the right,
    // there is a combination of three apples and two apples together making a total
    // of 5 apples. This observation is equivalent to the mathematical expression
    // "3 + 2 = 5"
    // Besides counting fruit, addition can also represent combining other physical object.
    return(x + y);
}

for(let i = 0; i < 500000000; i++) {  
    if (add(i, i++) < 5) {
  //
    }
}

exemplo2.js:

'use strict';

function add(x, y) {  
    // Addition is one of the four elementary,
    // mathematical operation of arithmetic, with the other being subtractions,
    // multiplications and divisions. The addition of two whole numbers is the total
    // amount of those quantitiy combined. For example in the picture on the right,
    // there is a combination of three apples and two apples together making a total
    // of 5 apples. This observation is equivalent to the mathematical expression
    // "3 + 2 = 5"
    // Besides counting fruit, addition can also represent combining other physical object.
    return(x + y);
}

for(let i = 0; i < 500000000; i++) {  
    if (add(i, i++) < 5) {
    //
    }
}

Consegue perceber qual a diferença entre a lógica dos 2 códigos?

NENHUMA!

ha-ha

Bom se não tem nenhuma vamos medir o tempo de execução dos 2 exemplos:

(performance) ➜ () ➜ time node exemplo1.js 
node exemplo1.js  1.12s user 0.04s system 38% cpu 3.004 total  
(performance) ➜ () ➜ time node exemplo2.js
node exemplo2.js  2.11s user 0.02s system 98% cpu 2.168 total  

Separando os tempos temos:

node exemplo1.js  1.12s  
node exemplo2.js  2.11s  

Por que você acha que o primeiro exemplo roda quase 2x mais rápido?/

Vou responder essa pergunta com você, analise comigo essa frase do comentário no primeiro exemplo, o mais rápido:

arithmetic with the other being subtraction, multiplication and division.  

Agora analise a mesma porção no segundo exemplo, o mais lento:

arithmetic, with the other being subtractions, multiplications and divisions.  

Logo percebemos uma adiação de 4 caracteres: 1 , e 3 s e essa adição faz quebrar o limite de 600 caracteres, esse limite é importante pois o Crankshaft, que é o otimizador de compilação do V8, otimiza as função que possuam um tamanho de corpo menor que 600 caracteres.

O limite de caracteres pode ser mudado com max-inlined-source-size, vamos ver esse exemplo:

(performance) ➜ () ➜ time node exemplo1.js
node exemplo1.js  1.12s user 0.02s system 99% cpu 1.154 total  
(performance) ➜ () ➜ time node --max-inlined-source-size=610 exemplo2.js
node --max-inlined-source-size=610 exemplo2.js  1.12s user 0.02s system 98% cpu 1.155 total  

Separando agora temos:

node exemplo1.js  1.12s  
node --max-inlined-source-size=610 exemplo2.js  1.12s  

O valor de 610 já cobre o tamanho da função do exemplo2, então se você tiver função maiores basta aumentar esse valor.

No curso do Be MEAN isso é padrão para nosso código até porque trabalhamos com código amotizado.

Para mais dicas esse conteúdo també é uito bom http://www.html5rocks.com/en/tutorials/speed/v8/.

Até a próxima!

Comentários

comments powered by Disqus