SlideShare uma empresa Scribd logo
1 de 74
Baixar para ler offline
Funcionamento interno
do Node.js
Kirmayr Tomaz
Sobre mim
Kirmayr Tomaz
● De Manaus/AM
● Bacharel em Sistemas de Informação
- UFAM
● Organizador do Femug-AM
● Mentor no Traning Center
@kirmayrtomaz
tomaz.kirmayr@gmail.com
Sobre mim
Kirmayr Tomaz
● De Manaus/AM
● Bacharel em Sistemas de Informação
- UFAM
● Organizador do Femug-AM
● Mentor no Traning Center
@kirmayrtomaz
tomaz.kirmayr@gmail.com
SUMÁRIO
• Node Interno
○ Conceitos base
○ Estrutura do Node.js
○ Libuv
○ V8
•TurboFan
•Ignition
○ APIs
Node.js
Node.js Terminologia
● Single Thread
● Paralelismo e concorrência
● Síncrono e assíncrono
● I/O não bloqueante
● Orientada a Eventos
Estrutura do Node.js
Dependências Internas
● Libuv
● V8
● C-iris
● Crypto
● HTTP-parse
● Zlib
● OpenSSL
Ferramentas
● npm
● gyp
● gtest
V8 Libuv zlib
HTTP-
parse
OpenSSLC-ares
Node.js Binding Addons
Application/Module(JS)
V8 Libuv zlib
HTTP-
parse
OpenSSLC-ares
Node.js Binding Addons - N-API
Application/Module(JS)
Libuv
Libuv
Uma biblioteca open-source multiplataforma com
foco em I/O assincrono, desenvolvida
inicialmente para o Node.js
Libuv
● Event loop
● TCP e UDP socket assíncrono
● DNS assíncrono
● Operações assíncronas com arquivos
● Eventos de arquivos
● Thread pool
● Internal Process Communication (IPC) compartilhado entre os
sockets
● Child processes
Event Loop?
Como Funciona o
Callstack
● Sequência de chamadas de função que foram
executadas pela linguagem - LIFO (Last-in First Out)
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’)
CallStack
console
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’)
CallStack
IsNumber
IsType
CallStack
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’) console
CallStack
console.log(‘script start’);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
console.log(‘script stop’) console
Task Queue
● Background Thread (Pull Thread)
● Task Queue - Local onde os callbacks ficam
aguardando serem chamados
● Event Loop
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
console
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout 1
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
IsNumber
IsType
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
console
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout2
setTimeout2
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout2
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’)
const number = isNumber(3)
console.log(number)
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’)
console
CallStack Background
Thread
Task Queue
Event Loop
setTimeout1
setTimeout2
setTimeout1 setTimeout2
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
setTimeout1
CallStack Background
Thread
Task Queue
Event Loop
setTimeout2
console.log(‘script start’);
setTimeout(( )=> console.log(“setTimeout 1’’),0);
const isType = (value,type) => typeof value ===
type;
const isNumber= (num) => isType(num, ‘number’);
const number = isNumber(3);
console.log(number);
setTimeout(( )=> console.log(“setTimeout 2’’),0);
console.log(‘script stop’);
setTimeout2
Task Queue
● Macro Task - São processadas pelo Event Loop
● Micro Task - são programadas para executar após a
execução principal do código
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
console
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
setTimeout
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
Promise
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise then Promise then
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
console
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise then
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
Promise then
Promise then
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
Promise then
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
Promise then
CallStack Background
Thread
Task Queue / MacroTask
MicroTask
Event Loop
setTimeout
setTimeout
console.log(‘script start’);
setTimeout( function ( ) {
console.log(“setTimeout 1’’);
},0);
Promise.resolve( ).then( function ( ) {
console.log(‘promise 1’);
}).then( function ( ) {
console.log(‘promise 2’);
})
console.log(‘script stop’);
setTimeout
Não Bloqueie o
Event Loop
ATT> NODE.js
V8
V8
● Projeto Open-source desenvolvida pela Google, para
interpretar código javascript super performático, escrito
em C++ utilizado pelo google Chrome, Node.js e afins.
V8
● O javascript possui pouca informação sobre quais são
os tipos dos valores na sua aplicação, sendo que eles
podem mudar em tempo de execução
● Tipagem dinâmica pode ser um dos principais recursos
da linguagem, mas também é um dos principais motivos
pelos quais muitas vezes executa mais lento que
linguagens estaticamente tipadas
Design Elements
ATT> NODE.js
V8 - Classes Ocultas
● Uma das formas para minimizar esse problema é
utilizando as classes ocultas
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class P0
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class P0
Initial
Hidden
Class PA
Person
Object
Initial
Hidden
Class PA
Initial
Hidden
Class PB
Initial
Hidden
Class P0
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class PA
Initial
Hidden
Class PB
Initial
Hidden
Class P0
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class PA
Initial
Hidden
Class PB
Initial
Hidden
Class P0
function person (name, age ) {
//Criando classe oculta A
this.name = name;
//Criando classe oculta B
this.age = age;
}
//Utilizando classe oculta B
const developer = person(‘developer’, 15);
//Utilizando classe oculta B
const conference = person(‘conference’, 15);
//Criando e Utilizando classe oculta C
developer.linguagem = “javascript”;
Person
Object
Initial
Hidden
Class PB
Initial
Hidden
Class PC
Initial
Hidden
Class PA
Initial
Hidden
Class P0
Quanto mais previsíveis
são os objetos menos
classes ocultas serão
criadas Daniel Clifford
Manager and Tech Lead V8 Team,
Google Chrome
V8 - Dynamic Machine Code Generation
● Compilador Completo
○ Inline Cache
● Compilador Otimizado
V8 - Dynamic Code Generation
http://v8-io12.appspot.com/#68
Pipeline V8
Pipeline de compilação (2010)
Full-
Codegen
Código Não
Otimizado
Crankshaft
Código
otimizado
Parser AST
JavaScript
OtimizaçãoBaseline
Referência: TurboFan: A new code generation architecture for V8
V8 - Turbofan
TurboFan
● Iniciado em 2013
● Feito para otimizar as novas features do ES6
● Otimização mais sustentável e extensível para todas as
arquiteturas
● O Turbofan adicionou uma fase explícita de compilação de
seleção de instruções que permite escrever muito menos
codigo específico para cada arquitetura
Full-
Codegen
Código Não
otimizado
Crankshaft
Código
otimizado
TurboFan
Parser AST
JavaScript
OtimizaçãoBaseline
Referência: TurboFan: A new code generation architecture for V8
Pipeline de compilação (2014)
V8 - Ignition
V8 - Ignition
● Redução do consumo de memória dos
dispositivos móveis com 512mb-1g ram
● Redução de memória
● Redução do overhead do parse
● Código 8x menor que o do Full-Codegen
● Utiliza o Back-end do Turbofan
Junção do Ignition + Turbofan
● TurboFan e Ignition são utilizados na versão 5.9 do V8
● Menor consumo de memória
● Preocupação em otimizar códigos (BlueBird, Babel e etc)
● 20-35% mais rápido pelo Speedometer
● No Node.js 10%+ performance
Ignition
Bytecode
Código
otimizado
TurboFan
Parser AST
JavaScript
OtimizaçãoInterpretador
Referência: TurboFan: A new code generation architecture for V8
Pipeline de compilação (2017)
API’s Nodejs
MUITO
O que fazer quando a aplicação necessita de
processamento ou
bloqueia o Event Loop ?
Child Process
● Node foi desenvolvimento para processos que
necessitam de muito I/O
● Pode ajudar a externalizar o uso intensivo de CPU da
sua single Thread do Node.js
Child Process
● Deixa o event Loop do processo pai mais limpo
● Cria um processo filho, ouve e controla
● Exec() e Spawn()
○ Exec executa em buffer
○ Spawn cria um novo processo e retorna uma
interface de stream pelo I/O
Não bloqueie o event
loop, crie um Child
Process
V8
MÚLTIPLOS NÚCLEOS
Possuo um processador
porém o node.js utiliza apenas uma
única Thread
● Uma única instância do node é executada numa single
Thread
● Uma das vantagens de ter um processador de
múltiplos núcleos é que às vezes ele pode ser
executado em clusters
● O Node.js se encarrega de executar e balancear a
carga para cada processo
Cluster
Conclusão
Obrigado xD
Referências
Estrutura interna Node.js
- https://nodejs.org/en/docs/meta/topics/dependencies/
Libuv
- http://docs.libuv.org/en/v1.x/design.html
Event Loop
- http://latentflip.com/loupe/
- https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/
- https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/
- https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
- http://walde.co/2016/11/27/node-js-o-que-e-esse-event-loop-afinal/
- https://www.youtube.com/watch?v=8aGhZQkoFbQ
- https://www.youtube.com/watch?v=va8-xdxTywU
Referências
V8
- https://www.html5rocks.com/en/tutorials/speed/v8/
- http://developers.scup.com/otimizando-seu-javascript-no-v8-node-js/
- https://github.com/v8/v8/wiki/Design%20Elements
- https://www.youtube.com/watch?v=UJPdhx5zTaw
- Turbofan - https://www.youtube.com/watch?v=M1FBosB5tjM
Child Process
- https://nodejs.org/api/child_process.html
Cluster
- https://nodejs.org/api/cluster.html
- http://rowanmanning.com/posts/node-cluster-and-express/
Centro
Av. Presidente Wilson,
231 - 29º andar
(21) 2240-2030
Cidade Monções
Av. Nações Unidas,
11.541 - 3º andar
(11) 4119-0449
Savassi
Av. Getúlio Vargas, 671
Sala 800 - 8º andar
(31) 3360-8900
www.concrete.com.br
Centro
Av. Presidente Wilson,
231 - 29º andar
(21) 2240-2030
Cidade Monções
Av. Nações Unidas,
11.541 - 3º andar
(11) 4119-0449
Savassi
Av. Getúlio Vargas, 671
Sala 800 - 8º andar
(31) 3360-8900
www.concrete.com.br

Mais conteúdo relacionado

Mais procurados

Ferramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain EthereumFerramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain EthereumOriginalMy.com
 
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...Cezinha Anjos
 
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSpherePortando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphereEloi Júnior
 

Mais procurados (7)

Ferramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain EthereumFerramentas para desenvolvimento no blockchain Ethereum
Ferramentas para desenvolvimento no blockchain Ethereum
 
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
Javascript assíncrono - Um bate-papo sobre event loop, event queue, callbacks...
 
Rtai Apresentacao
Rtai ApresentacaoRtai Apresentacao
Rtai Apresentacao
 
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSpherePortando app JavaME S40 para C# WP7:  Um estudo de caso real da app CalcSphere
Portando app JavaME S40 para C# WP7: Um estudo de caso real da app CalcSphere
 
Jsummit 2014
Jsummit 2014Jsummit 2014
Jsummit 2014
 
Tutorial JavaFX simples
Tutorial JavaFX simplesTutorial JavaFX simples
Tutorial JavaFX simples
 
Depuração de software
Depuração de softwareDepuração de software
Depuração de software
 

Semelhante a Funcionamento interno do node.js e boas práticas

Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o NodejsCaio Cutrim
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias WebRildo Pragana
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaDeivid Martins
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoLeandro Zanuz
 
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013Danival Calegari
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Curso Intensivo de N8N
Curso Intensivo de N8NCurso Intensivo de N8N
Curso Intensivo de N8NAutotic
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosEmbarcados
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
sys._current_frames(), Radiografando seu software em tempo real
 sys._current_frames(), Radiografando seu software em tempo real sys._current_frames(), Radiografando seu software em tempo real
sys._current_frames(), Radiografando seu software em tempo realLeonardo Rochael Almeida
 

Semelhante a Funcionamento interno do node.js e boas práticas (20)

Conhecendo o Nodejs
Conhecendo o NodejsConhecendo o Nodejs
Conhecendo o Nodejs
 
Secomp 2018 - DO Ruby ao Elixir
Secomp 2018 - DO Ruby ao ElixirSecomp 2018 - DO Ruby ao Elixir
Secomp 2018 - DO Ruby ao Elixir
 
Aplicações com Tecnologias Web
Aplicações com Tecnologias WebAplicações com Tecnologias Web
Aplicações com Tecnologias Web
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Mini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e DistribuídaMini-curso Programação Paralela e Distribuída
Mini-curso Programação Paralela e Distribuída
 
Curso de Node JS Básico
Curso de Node JS BásicoCurso de Node JS Básico
Curso de Node JS Básico
 
Django Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a OtimizaçãoDjango Apps - Do Núcleo a Otimização
Django Apps - Do Núcleo a Otimização
 
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
Curso Intensivo de N8N
Curso Intensivo de N8NCurso Intensivo de N8N
Curso Intensivo de N8N
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
sys._current_frames(), Radiografando seu software em tempo real
 sys._current_frames(), Radiografando seu software em tempo real sys._current_frames(), Radiografando seu software em tempo real
sys._current_frames(), Radiografando seu software em tempo real
 
burlando um WAF
burlando um WAFburlando um WAF
burlando um WAF
 
Struts2 remote codeexecution
Struts2 remote codeexecutionStruts2 remote codeexecution
Struts2 remote codeexecution
 

Último

PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números Mary Alvarenga
 
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptx
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptxPLANOS E EIXOS DO CORPO HUMANO.educacao física pptx
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptxSamiraMiresVieiradeM
 
Bullying - Atividade com caça- palavras
Bullying   - Atividade com  caça- palavrasBullying   - Atividade com  caça- palavras
Bullying - Atividade com caça- palavrasMary Alvarenga
 
Mapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxMapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxBeatrizLittig1
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...Rosalina Simão Nunes
 
Ficha de trabalho com palavras- simples e complexas.pdf
Ficha de trabalho com palavras- simples e complexas.pdfFicha de trabalho com palavras- simples e complexas.pdf
Ficha de trabalho com palavras- simples e complexas.pdfFtimaMoreira35
 
análise de redação completa - Dissertação
análise de redação completa - Dissertaçãoanálise de redação completa - Dissertação
análise de redação completa - DissertaçãoMaiteFerreira4
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfLeloIurk1
 
Literatura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.pptLiteratura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.pptMaiteFerreira4
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...azulassessoria9
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxferreirapriscilla84
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....LuizHenriquedeAlmeid6
 
Atividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas GeográficasAtividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas Geográficasprofcamilamanz
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdfLeloIurk1
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividadeMary Alvarenga
 
Revista-Palavra-Viva-Profetas-Menores (1).pdf
Revista-Palavra-Viva-Profetas-Menores (1).pdfRevista-Palavra-Viva-Profetas-Menores (1).pdf
Revista-Palavra-Viva-Profetas-Menores (1).pdfMárcio Azevedo
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...azulassessoria9
 
VARIEDADES LINGUÍSTICAS - 1. pptx
VARIEDADES        LINGUÍSTICAS - 1. pptxVARIEDADES        LINGUÍSTICAS - 1. pptx
VARIEDADES LINGUÍSTICAS - 1. pptxMarlene Cunhada
 

Último (20)

PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
CRUZADINHA - Leitura e escrita dos números
CRUZADINHA   -   Leitura e escrita dos números CRUZADINHA   -   Leitura e escrita dos números
CRUZADINHA - Leitura e escrita dos números
 
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptx
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptxPLANOS E EIXOS DO CORPO HUMANO.educacao física pptx
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptx
 
Bullying - Atividade com caça- palavras
Bullying   - Atividade com  caça- palavrasBullying   - Atividade com  caça- palavras
Bullying - Atividade com caça- palavras
 
Mapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docxMapa mental - Classificação dos seres vivos .docx
Mapa mental - Classificação dos seres vivos .docx
 
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de..."É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
"É melhor praticar para a nota" - Como avaliar comportamentos em contextos de...
 
Ficha de trabalho com palavras- simples e complexas.pdf
Ficha de trabalho com palavras- simples e complexas.pdfFicha de trabalho com palavras- simples e complexas.pdf
Ficha de trabalho com palavras- simples e complexas.pdf
 
análise de redação completa - Dissertação
análise de redação completa - Dissertaçãoanálise de redação completa - Dissertação
análise de redação completa - Dissertação
 
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdfENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
ENSINO RELIGIOSO 7º ANO INOVE NA ESCOLA.pdf
 
Literatura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.pptLiteratura Brasileira - escolas literárias.ppt
Literatura Brasileira - escolas literárias.ppt
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
 
Discurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptxDiscurso Direto, Indireto e Indireto Livre.pptx
Discurso Direto, Indireto e Indireto Livre.pptx
 
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
Slides Lição 5, Betel, Ordenança para uma vida de vigilância e oração, 2Tr24....
 
Atividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas GeográficasAtividades sobre Coordenadas Geográficas
Atividades sobre Coordenadas Geográficas
 
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
5 bloco 7 ano - Ensino Relogioso- Lideres Religiosos _ Passei Direto.pdf
 
Música Meu Abrigo - Texto e atividade
Música   Meu   Abrigo  -   Texto e atividadeMúsica   Meu   Abrigo  -   Texto e atividade
Música Meu Abrigo - Texto e atividade
 
Revista-Palavra-Viva-Profetas-Menores (1).pdf
Revista-Palavra-Viva-Profetas-Menores (1).pdfRevista-Palavra-Viva-Profetas-Menores (1).pdf
Revista-Palavra-Viva-Profetas-Menores (1).pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
VARIEDADES LINGUÍSTICAS - 1. pptx
VARIEDADES        LINGUÍSTICAS - 1. pptxVARIEDADES        LINGUÍSTICAS - 1. pptx
VARIEDADES LINGUÍSTICAS - 1. pptx
 
CINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULACINEMATICA DE LOS MATERIALES Y PARTICULA
CINEMATICA DE LOS MATERIALES Y PARTICULA
 

Funcionamento interno do node.js e boas práticas

  • 2. Sobre mim Kirmayr Tomaz ● De Manaus/AM ● Bacharel em Sistemas de Informação - UFAM ● Organizador do Femug-AM ● Mentor no Traning Center @kirmayrtomaz tomaz.kirmayr@gmail.com
  • 3. Sobre mim Kirmayr Tomaz ● De Manaus/AM ● Bacharel em Sistemas de Informação - UFAM ● Organizador do Femug-AM ● Mentor no Traning Center @kirmayrtomaz tomaz.kirmayr@gmail.com
  • 4. SUMÁRIO • Node Interno ○ Conceitos base ○ Estrutura do Node.js ○ Libuv ○ V8 •TurboFan •Ignition ○ APIs
  • 6. Node.js Terminologia ● Single Thread ● Paralelismo e concorrência ● Síncrono e assíncrono ● I/O não bloqueante ● Orientada a Eventos
  • 7. Estrutura do Node.js Dependências Internas ● Libuv ● V8 ● C-iris ● Crypto ● HTTP-parse ● Zlib ● OpenSSL Ferramentas ● npm ● gyp ● gtest
  • 8. V8 Libuv zlib HTTP- parse OpenSSLC-ares Node.js Binding Addons Application/Module(JS)
  • 9. V8 Libuv zlib HTTP- parse OpenSSLC-ares Node.js Binding Addons - N-API Application/Module(JS)
  • 10. Libuv
  • 11. Libuv Uma biblioteca open-source multiplataforma com foco em I/O assincrono, desenvolvida inicialmente para o Node.js
  • 12. Libuv ● Event loop ● TCP e UDP socket assíncrono ● DNS assíncrono ● Operações assíncronas com arquivos ● Eventos de arquivos ● Thread pool ● Internal Process Communication (IPC) compartilhado entre os sockets ● Child processes
  • 14. Callstack ● Sequência de chamadas de função que foram executadas pela linguagem - LIFO (Last-in First Out)
  • 15. console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) CallStack console
  • 16. console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) CallStack IsNumber IsType
  • 17. CallStack console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) console
  • 18. CallStack console.log(‘script start’); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) console.log(‘script stop’) console
  • 19. Task Queue ● Background Thread (Pull Thread) ● Task Queue - Local onde os callbacks ficam aguardando serem chamados ● Event Loop
  • 20. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop console
  • 21. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout 1
  • 22. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 IsNumber IsType
  • 23. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 console
  • 24. console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout2 setTimeout2
  • 25. CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout2 console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’) const number = isNumber(3) console.log(number) setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’) console
  • 26. CallStack Background Thread Task Queue Event Loop setTimeout1 setTimeout2 setTimeout1 setTimeout2 console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); setTimeout1
  • 27. CallStack Background Thread Task Queue Event Loop setTimeout2 console.log(‘script start’); setTimeout(( )=> console.log(“setTimeout 1’’),0); const isType = (value,type) => typeof value === type; const isNumber= (num) => isType(num, ‘number’); const number = isNumber(3); console.log(number); setTimeout(( )=> console.log(“setTimeout 2’’),0); console.log(‘script stop’); setTimeout2
  • 28. Task Queue ● Macro Task - São processadas pelo Event Loop ● Micro Task - são programadas para executar após a execução principal do código
  • 29. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); console
  • 30. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); setTimeout
  • 31. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); Promise
  • 32. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise then Promise then console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); console
  • 33. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise then console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); Promise then Promise then
  • 34. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout Promise then console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); Promise then
  • 35. CallStack Background Thread Task Queue / MacroTask MicroTask Event Loop setTimeout setTimeout console.log(‘script start’); setTimeout( function ( ) { console.log(“setTimeout 1’’); },0); Promise.resolve( ).then( function ( ) { console.log(‘promise 1’); }).then( function ( ) { console.log(‘promise 2’); }) console.log(‘script stop’); setTimeout
  • 36. Não Bloqueie o Event Loop ATT> NODE.js
  • 37. V8
  • 38. V8 ● Projeto Open-source desenvolvida pela Google, para interpretar código javascript super performático, escrito em C++ utilizado pelo google Chrome, Node.js e afins.
  • 39. V8 ● O javascript possui pouca informação sobre quais são os tipos dos valores na sua aplicação, sendo que eles podem mudar em tempo de execução ● Tipagem dinâmica pode ser um dos principais recursos da linguagem, mas também é um dos principais motivos pelos quais muitas vezes executa mais lento que linguagens estaticamente tipadas
  • 41. V8 - Classes Ocultas ● Uma das formas para minimizar esse problema é utilizando as classes ocultas
  • 42. function person (name, age ) { //Criando classe oculta A this.name = name; //Criando classe oculta B this.age = age; } //Utilizando classe oculta B const developer = person(‘developer’, 15); //Utilizando classe oculta B const conference = person(‘conference’, 15); //Criando e Utilizando classe oculta C developer.linguagem = “javascript”; Person Object Initial Hidden Class P0
  • 43. function person (name, age ) { //Criando classe oculta A this.name = name; //Criando classe oculta B this.age = age; } //Utilizando classe oculta B const developer = person(‘developer’, 15); //Utilizando classe oculta B const conference = person(‘conference’, 15); //Criando e Utilizando classe oculta C developer.linguagem = “javascript”; Person Object Initial Hidden Class P0 Initial Hidden Class PA
  • 44. Person Object Initial Hidden Class PA Initial Hidden Class PB Initial Hidden Class P0 function person (name, age ) { //Criando classe oculta A this.name = name; //Criando classe oculta B this.age = age; } //Utilizando classe oculta B const developer = person(‘developer’, 15); //Utilizando classe oculta B const conference = person(‘conference’, 15); //Criando e Utilizando classe oculta C developer.linguagem = “javascript”;
  • 45. function person (name, age ) { //Criando classe oculta A this.name = name; //Criando classe oculta B this.age = age; } //Utilizando classe oculta B const developer = person(‘developer’, 15); //Utilizando classe oculta B const conference = person(‘conference’, 15); //Criando e Utilizando classe oculta C developer.linguagem = “javascript”; Person Object Initial Hidden Class PA Initial Hidden Class PB Initial Hidden Class P0
  • 46. function person (name, age ) { //Criando classe oculta A this.name = name; //Criando classe oculta B this.age = age; } //Utilizando classe oculta B const developer = person(‘developer’, 15); //Utilizando classe oculta B const conference = person(‘conference’, 15); //Criando e Utilizando classe oculta C developer.linguagem = “javascript”; Person Object Initial Hidden Class PA Initial Hidden Class PB Initial Hidden Class P0
  • 47. function person (name, age ) { //Criando classe oculta A this.name = name; //Criando classe oculta B this.age = age; } //Utilizando classe oculta B const developer = person(‘developer’, 15); //Utilizando classe oculta B const conference = person(‘conference’, 15); //Criando e Utilizando classe oculta C developer.linguagem = “javascript”; Person Object Initial Hidden Class PB Initial Hidden Class PC Initial Hidden Class PA Initial Hidden Class P0
  • 48. Quanto mais previsíveis são os objetos menos classes ocultas serão criadas Daniel Clifford Manager and Tech Lead V8 Team, Google Chrome
  • 49. V8 - Dynamic Machine Code Generation ● Compilador Completo ○ Inline Cache ● Compilador Otimizado
  • 50. V8 - Dynamic Code Generation http://v8-io12.appspot.com/#68
  • 52. Pipeline de compilação (2010) Full- Codegen Código Não Otimizado Crankshaft Código otimizado Parser AST JavaScript OtimizaçãoBaseline Referência: TurboFan: A new code generation architecture for V8
  • 54. TurboFan ● Iniciado em 2013 ● Feito para otimizar as novas features do ES6 ● Otimização mais sustentável e extensível para todas as arquiteturas ● O Turbofan adicionou uma fase explícita de compilação de seleção de instruções que permite escrever muito menos codigo específico para cada arquitetura
  • 55. Full- Codegen Código Não otimizado Crankshaft Código otimizado TurboFan Parser AST JavaScript OtimizaçãoBaseline Referência: TurboFan: A new code generation architecture for V8 Pipeline de compilação (2014)
  • 57. V8 - Ignition ● Redução do consumo de memória dos dispositivos móveis com 512mb-1g ram ● Redução de memória ● Redução do overhead do parse ● Código 8x menor que o do Full-Codegen ● Utiliza o Back-end do Turbofan
  • 58. Junção do Ignition + Turbofan ● TurboFan e Ignition são utilizados na versão 5.9 do V8 ● Menor consumo de memória ● Preocupação em otimizar códigos (BlueBird, Babel e etc) ● 20-35% mais rápido pelo Speedometer ● No Node.js 10%+ performance
  • 59. Ignition Bytecode Código otimizado TurboFan Parser AST JavaScript OtimizaçãoInterpretador Referência: TurboFan: A new code generation architecture for V8 Pipeline de compilação (2017)
  • 61. MUITO O que fazer quando a aplicação necessita de processamento ou bloqueia o Event Loop ?
  • 62. Child Process ● Node foi desenvolvimento para processos que necessitam de muito I/O ● Pode ajudar a externalizar o uso intensivo de CPU da sua single Thread do Node.js
  • 63. Child Process ● Deixa o event Loop do processo pai mais limpo ● Cria um processo filho, ouve e controla ● Exec() e Spawn() ○ Exec executa em buffer ○ Spawn cria um novo processo e retorna uma interface de stream pelo I/O
  • 64. Não bloqueie o event loop, crie um Child Process V8
  • 65. MÚLTIPLOS NÚCLEOS Possuo um processador porém o node.js utiliza apenas uma única Thread
  • 66. ● Uma única instância do node é executada numa single Thread ● Uma das vantagens de ter um processador de múltiplos núcleos é que às vezes ele pode ser executado em clusters ● O Node.js se encarrega de executar e balancear a carga para cada processo Cluster
  • 67.
  • 68.
  • 70.
  • 72. Referências Estrutura interna Node.js - https://nodejs.org/en/docs/meta/topics/dependencies/ Libuv - http://docs.libuv.org/en/v1.x/design.html Event Loop - http://latentflip.com/loupe/ - https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ - https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop/ - https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/ - http://walde.co/2016/11/27/node-js-o-que-e-esse-event-loop-afinal/ - https://www.youtube.com/watch?v=8aGhZQkoFbQ - https://www.youtube.com/watch?v=va8-xdxTywU
  • 73. Referências V8 - https://www.html5rocks.com/en/tutorials/speed/v8/ - http://developers.scup.com/otimizando-seu-javascript-no-v8-node-js/ - https://github.com/v8/v8/wiki/Design%20Elements - https://www.youtube.com/watch?v=UJPdhx5zTaw - Turbofan - https://www.youtube.com/watch?v=M1FBosB5tjM Child Process - https://nodejs.org/api/child_process.html Cluster - https://nodejs.org/api/cluster.html - http://rowanmanning.com/posts/node-cluster-and-express/
  • 74. Centro Av. Presidente Wilson, 231 - 29º andar (21) 2240-2030 Cidade Monções Av. Nações Unidas, 11.541 - 3º andar (11) 4119-0449 Savassi Av. Getúlio Vargas, 671 Sala 800 - 8º andar (31) 3360-8900 www.concrete.com.br Centro Av. Presidente Wilson, 231 - 29º andar (21) 2240-2030 Cidade Monções Av. Nações Unidas, 11.541 - 3º andar (11) 4119-0449 Savassi Av. Getúlio Vargas, 671 Sala 800 - 8º andar (31) 3360-8900 www.concrete.com.br