SlideShare a Scribd company logo
Why Angular and React are so fast?
Max Koretskyi aka Wizard
Developer Advocate
2015 20162014 2017 2018
A failed startup
that made me
learn to program
and gave broad
programming
experience
SO activity that
build my
knowledge base
and created a
foundation for
blogging
Angular In Depth
that helped me
build strong
community
and establish
reputation as an
Angular expert
Public speaking
that helped me
meet awesome
people and
become GDE and
MVP
Developer Advocate
job that allows me to
to develop
programming and
marketing skills at
the same time
where 100-hour work weeks got me in 5 years
 maxkoretskyi.com/connecting-the-dots
Find out more at
Monomorphism Bit fields & Bit masks Bloom filters
Benedikt Meurer, V8 optimizations lead engineer
Alex Rickabught, Angular core team
Dan Ambramov, React core team
Kudos to
Optimization techniques in Angular and React
We use one type for all View nodes so that property
access in loops stay monomorphic!
Misko Hevery, technical lead of Angular
Angular sources comments
Fiber node … shares the same hidden class.
Never add fields outside of construction in `ReactFiber`
Contributing To React Fiber guidelines
Sebastian Markbåge, technical lead of React
• What is hidden class and why is it shared by fiber and view nodes?
Questions we need to answer
• What is monomophic property access and why is it important?
• What is a fiber node in React & a view node in Angular?
Representing a template in Angular
@Component({
template: `
<h1>The title is: {{title}}</h1>
<h2>My hero is: {{hero}}</h2>
`
})
export class AppComponent {
title = 'Tour of Heroes';
hero = 'Windstorm';
}
Type: h1
Type: h2
View Nodes
bindings: {
text: "Tour of Heroes"
}
bindings: {
text: " 'Windstorm"
}
Representing a template in React
class App extends Component {
state = {
title: 'Tour of Heroes',
hero: 'Windstorm'
};
render() {
return (
[
<h1>The title is: {this.state.title}</h1>,
<h2>My hero is: {this.state.hero}</h2>
]
)
}
}
Type: h1
Type: h2
props: {
children: "Tour of Heroes"
}
props: {
children: " Windstorm "
}
Fiber Nodes
Fiber and View nodes are used a lot
when processing changes
properties could easily be accessed
over 10 000* times
function updateNode(node, …) {
let value = node.property;
}
*100 components x 10 elements x 10 function calls
Locating value of an
object's property
in memory
is a complicated process
let object = { x: 5, y: 6 };
JSObject
5
6
Property information
Offset: 0
[[Writable]]: true
[[Enumerable]]: true
[[Configurable]]: true
Shape
'x'
'y'
Property information
Offset: 1
[[Writable]]: true
[[Enumerable]]: true
[[Configurable]]: true
Shapes aka Hidden Class (Maps in V8)
let object = {
x: 5,
y: 6
};
JSObject
5
6
Property information
Offset: 0
...
Shape
'x'
'y'
Property information
Offset: 1
...
Location in memory with offsets
0 0 0 0 0 1 1 00 0 0 0 0 1 0 1
property `x` address
offset 0 bytes
5
property `y` address
offset 1 byte
6
object
pointer
Why do we need shapes?
5
6
JSObject a
Property
information
Shape
'x'
'y'
Property
information
JSObject b
7
8
let a = { x: 5, y: 6 };
let b = { x: 7, y: 8 };
Shapes help reduce memory footprint
let a = { x: 5, y: 6 }
let b = { x: 7, y: 8 }
b.w = 9;
b.z = 10;
JSObject a
5
6
Shape
'x'
'y'
JSObject b
7
8
Shape
'w'
Shape
'z'
9
10
Transition chains
Inline Caching (IC)
to the rescue
getX({x: a})
function getX(o) {
return o.x;
}
Optimization through Inline Cache
shape offsetstate
function 'getX'
feedback vector xmono
Property information
Offset: 0
...
Shape(x)
'x'
0
Monomorphic property access
getX(a);
getX(b);
getX(c);
function getX(o) { return o.x; }
let a = { x: 5, y: 6 };
let b = { x: 7, y: 8 };
let b = { x: 7, y: 8 };
a function only saw one type of a shape
Polymorphic property access
getX(a);
getX(b);
getX(c);
getX(D);
function getX(o) { return o.x; }
let a = {x: 5, y: 6};
let b = {y: 7, x: 8}; // different order
let b = {y: 7, x: 8, z: 5}; // new properties
let d = Object.create({}, {}; // different prototype
a function only saw up to 4 different types of a shape
Megamorphic property access
Monomorphic prop access maybe
up to 100 times faster than
megamorphic.
a function saw more than 4 different types of a shape
Frameworks enforce
the same shape (hidden class)
for fiber and view nodes
to enable monomorphic property access
Template node types
Fiber node (React) Template element View node (Angular)
HostComponent HTMLElementNode TypeElement
HostText HTMLTextNode TypeText
FunctionComponent,
ClassComponent
Component Component
type Element {
fieldA;
fieldB;
}
type Text {
fieldC;
field;
}
type Component {
fieldE;
fieldF;
}
Property access is not monormophic
type Node {
tag: nodeType;
fieldA | null;
fieldB | null;
fieldC | null;
fieldD | null;
fieldE | null;
fieldF | null;
}
Property access is monormophic
type Fiber {
tag: integer,
...
}
interface NodeDef {
flags: bitfield;
...
}
FunctionComponent = 0;
ClassComponent = 1;
IndeterminateComponent = 2;
HostRoot = 3;
HostPortal = 4;
HostComponent = 5;
HostText = 6;
Fragment = 7;
…
None = 0,
TypeElement = 1 << 0,
TypeText = 1 << 1,
ProjectedTemplate = 1 << 2,
...
TypeDirective = 1 << 14,
Component = 1 << 15,
Type definitions in Angular and React
function beginWork(fiberNode, ...) {
...
switch (fiberNode.tag) {
case FunctionalComponent: {...}
case ClassComponent: {...}
case HostComponent:
return updateHostComponent(fiberNode, ...);
case ...
}
}
Branching by node type in React
Bit fields (vector) & Bit masks
Bit field is just an array of bits
let bitField = 0b01010001; // 81
0 1 0 1 0 0 0 1
React uses bit fields
to encode effects
Effects in React Fiber architecture
• Render phase (build a list of effects)
• Process changes from setState
• Update props on child elements
• Call lifecycle methods (shouldComponentUpdate etc.)
The result of the phase is a tree of fiber nodes marked with side-effects.
• Commit phase (apply effects)
• Update DOM
• Call lifecycle methods (componentDidUpdate etc.)
• Update refs
Before render phase: After render phase:
4..toString(2) = 100
type: 'span'
effectTag: 0
type: 'span'
effectTag: 4
const effectTags = {
Placement = : 0b000010;
Update : 0b000100;
PlacementAndUpdate : 0b000110;
...
}
0 0 0 1 0 0
PlacementUpdate
let effectTag = 0b00000000;
0 0 0 0 0 0 0 0
effectTag = effectTag | effectTags.Update;
0 0 0 0 0 1 0 0
Write with bitwise OR
Define bitfield
isUpdateEffectSet = !! (effectTag & effectTags.Update);
Check with bitwise AND
Branching by effect in React
function updateHostEffects(fiberNode) {
...
const effectTag = fiberNode.effectTag;
if (effectTag & effectTags.Placement) { ... }
if (effectTag & effectTags.PlacementAndUpdate) { ... }
if (effectTag & effectTags.Update) { ... }
...
}
Encoding objects in bit fields
let user = {
first: true,
group: 20,
sortKey: 347843
};
allocations in memory for:
• a standard JS object
• a shape with keys metadata
• 3 values stored in the keys
Any way to avoid those allocations?
Encoding objects in bit fields
Field Restrictions on values Bits required
sortKey less than 1M 20 (220 > 1M)
group less than 50 6 (26 = 64)
first boolean 1
00000 0 000000 0000000000000000000
sortKeygroupfirst
32 bits
Encoding objects in bit fields
let user = 0x 05454ec3;
let user = 0b 00000 1 010100 001010100111011000011;
let user = { first: true, group: 20, sortKey: 347843 };
Field Decimal Binary
sortKey 347843 001010100111011000011
group 20 010100
first true 1
Why bother?
• millions of allocations for
objects and values
1 million of objects require
VS
• one typed array for one million
32-integer values
Regular JS object Encoded in a bitfield
• a ton of GC (garbage collection)
cleanup after each iteration
• much larger and potentially
fragmented memory usage
• almost zero garbage collection
• smaller and contiguous memory
usage
Bloom filters
is element in the set?
DEFINITELY NO
100% probability
MAYBE
varying probability
data structure that answers the question
0 0 0 0 1 0
Is element in a set? Is bits [n1,n2…n] set?
Each element is encoded in a bit field
let value = "Jonh";
calculateBitNumber(value); // 2
John (2)
0 0 0 0 0 0 0 0
Anna (1)Tom (4)
[ "John", "Anna", "Tom" ]
let calculateBitValue = (value) => value.charCodeAt(0) % 8
111
Why "yes" is not guaranteed?
Anna (1)
0 0 0 0 1 0 1 1
collisions
Tom (4)
John (2)
Jane (2)
Less slots, more collisions
How to increase
probability of "Yes"?
Anna (1,6)
0 1 1 0 1 0 1 1
no
collisions
Tom (4,7)
John (2,7)
Jane (2,1)
Less slots, more collisions
Where does Angular use this?
Dependency Injection
mechanism
ServiceA
ServiceB
ServiceC
constructor( ServiceA ) {}
Injector
ServiceD
Hierarchical
injectors
Dashboard
component
Widget
component
SiteAnalytics
component
WidgetManager
Injector
Injector
WidgetManager
Injector
Is here?
no – go up
Is here?
no – go up
Is here?
yes – resolve
Bloom
filters
Injector
Dashboard
component
Widget
component
SiteAnalytics
component
WidgetManager
WidgetManager
Injector
Is here?
no – go up
Is here?
no – go up
resolve
Injector
Bloom
filter
Bloom
filter
Bloom
filter
Is here?
maybe –
chec injector
How does Angular implement
bloom filters?
Bloom filter is 256 bits in length
8 buckets
32
bits
32
bits
32
bits
32
bits
32
bits
32
bits
32
bits
32
bits
A plain counter modulo of 256 to generate hash
let counter = 0;
function calculateBitValue() {
let hash = counter % 256;
counter = counter + 1;
return hash;
}
let bitValue1 = calculateBitValue(); // 0
let bitValue2 = calculateBitValue(); // 1
...
let bitValue256 = calculateBitValue(); // 0
let bitValue257 = calculateBitValue(); // 1
No collisions with less than
256 services per Injector
"yes" answer is 100%
Ask me anything
Depth
15th of June, 2019
first Angular conference in Kyiv
angular-in-depth.org
Angular in
maxkoretskyi.com/reverse-engineering
maxkoretskyi.com/connecting-the-dots
Follow me to learn fundamentals
maxkoretskyi
maxkoretskyi
maxkoretskyi.com
JS Fest 2019. Max Koretskiy. A sneak peek into super optimized code in JS frameworks

More Related Content

What's hot

The Ring programming language version 1.5.4 book - Part 73 of 185
The Ring programming language version 1.5.4 book - Part 73 of 185The Ring programming language version 1.5.4 book - Part 73 of 185
The Ring programming language version 1.5.4 book - Part 73 of 185
Mahmoud Samir Fayed
 
The Ring programming language version 1.8 book - Part 80 of 202
The Ring programming language version 1.8 book - Part 80 of 202The Ring programming language version 1.8 book - Part 80 of 202
The Ring programming language version 1.8 book - Part 80 of 202
Mahmoud Samir Fayed
 
Objective-C Crash Course for Web Developers
Objective-C Crash Course for Web DevelopersObjective-C Crash Course for Web Developers
Objective-C Crash Course for Web Developers
Joris Verbogt
 
Awesomeness of JavaScript…almost
Awesomeness of JavaScript…almostAwesomeness of JavaScript…almost
Awesomeness of JavaScript…almost
Quinton Sheppard
 
A Layered Architecture for the Model-driven Development of Distributed Simula...
A Layered Architecture for the Model-driven Development of Distributed Simula...A Layered Architecture for the Model-driven Development of Distributed Simula...
A Layered Architecture for the Model-driven Development of Distributed Simula...
Daniele Gianni
 
The Ring programming language version 1.5.3 book - Part 83 of 184
The Ring programming language version 1.5.3 book - Part 83 of 184The Ring programming language version 1.5.3 book - Part 83 of 184
The Ring programming language version 1.5.3 book - Part 83 of 184
Mahmoud Samir Fayed
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design Patterns
Stefano Fago
 
The Ring programming language version 1.3 book - Part 22 of 88
The Ring programming language version 1.3 book - Part 22 of 88The Ring programming language version 1.3 book - Part 22 of 88
The Ring programming language version 1.3 book - Part 22 of 88
Mahmoud Samir Fayed
 
The Ring programming language version 1.5.4 book - Part 31 of 185
The Ring programming language version 1.5.4 book - Part 31 of 185The Ring programming language version 1.5.4 book - Part 31 of 185
The Ring programming language version 1.5.4 book - Part 31 of 185
Mahmoud Samir Fayed
 
Building High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 FirestarterBuilding High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 Firestarter
Mithun T. Dhar
 
The Ring programming language version 1.8 book - Part 36 of 202
The Ring programming language version 1.8 book - Part 36 of 202The Ring programming language version 1.8 book - Part 36 of 202
The Ring programming language version 1.8 book - Part 36 of 202
Mahmoud Samir Fayed
 
The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.2 book - Part 6 of 181The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.2 book - Part 6 of 181
Mahmoud Samir Fayed
 
Es.next
Es.nextEs.next
Es.next
kevinsson
 
Object calisthenics
Object calisthenicsObject calisthenics
Object calisthenics
PolSnchezManzano
 
ハイブリッド言語Scalaを使う
ハイブリッド言語Scalaを使うハイブリッド言語Scalaを使う
ハイブリッド言語Scalaを使う
bpstudy
 
The Ring programming language version 1.9 book - Part 39 of 210
The Ring programming language version 1.9 book - Part 39 of 210The Ring programming language version 1.9 book - Part 39 of 210
The Ring programming language version 1.9 book - Part 39 of 210
Mahmoud Samir Fayed
 
All about scala
All about scalaAll about scala
All about scala
Yardena Meymann
 
Iphone course 1
Iphone course 1Iphone course 1
Iphone course 1
Janet Huang
 
Java ppt Gandhi Ravi (gandhiri@gmail.com)
Java ppt  Gandhi Ravi  (gandhiri@gmail.com)Java ppt  Gandhi Ravi  (gandhiri@gmail.com)
Java ppt Gandhi Ravi (gandhiri@gmail.com)
Gandhi Ravi
 

What's hot (19)

The Ring programming language version 1.5.4 book - Part 73 of 185
The Ring programming language version 1.5.4 book - Part 73 of 185The Ring programming language version 1.5.4 book - Part 73 of 185
The Ring programming language version 1.5.4 book - Part 73 of 185
 
The Ring programming language version 1.8 book - Part 80 of 202
The Ring programming language version 1.8 book - Part 80 of 202The Ring programming language version 1.8 book - Part 80 of 202
The Ring programming language version 1.8 book - Part 80 of 202
 
Objective-C Crash Course for Web Developers
Objective-C Crash Course for Web DevelopersObjective-C Crash Course for Web Developers
Objective-C Crash Course for Web Developers
 
Awesomeness of JavaScript…almost
Awesomeness of JavaScript…almostAwesomeness of JavaScript…almost
Awesomeness of JavaScript…almost
 
A Layered Architecture for the Model-driven Development of Distributed Simula...
A Layered Architecture for the Model-driven Development of Distributed Simula...A Layered Architecture for the Model-driven Development of Distributed Simula...
A Layered Architecture for the Model-driven Development of Distributed Simula...
 
The Ring programming language version 1.5.3 book - Part 83 of 184
The Ring programming language version 1.5.3 book - Part 83 of 184The Ring programming language version 1.5.3 book - Part 83 of 184
The Ring programming language version 1.5.3 book - Part 83 of 184
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design Patterns
 
The Ring programming language version 1.3 book - Part 22 of 88
The Ring programming language version 1.3 book - Part 22 of 88The Ring programming language version 1.3 book - Part 22 of 88
The Ring programming language version 1.3 book - Part 22 of 88
 
The Ring programming language version 1.5.4 book - Part 31 of 185
The Ring programming language version 1.5.4 book - Part 31 of 185The Ring programming language version 1.5.4 book - Part 31 of 185
The Ring programming language version 1.5.4 book - Part 31 of 185
 
Building High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 FirestarterBuilding High Perf Web Apps - IE8 Firestarter
Building High Perf Web Apps - IE8 Firestarter
 
The Ring programming language version 1.8 book - Part 36 of 202
The Ring programming language version 1.8 book - Part 36 of 202The Ring programming language version 1.8 book - Part 36 of 202
The Ring programming language version 1.8 book - Part 36 of 202
 
The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.2 book - Part 6 of 181The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.2 book - Part 6 of 181
 
Es.next
Es.nextEs.next
Es.next
 
Object calisthenics
Object calisthenicsObject calisthenics
Object calisthenics
 
ハイブリッド言語Scalaを使う
ハイブリッド言語Scalaを使うハイブリッド言語Scalaを使う
ハイブリッド言語Scalaを使う
 
The Ring programming language version 1.9 book - Part 39 of 210
The Ring programming language version 1.9 book - Part 39 of 210The Ring programming language version 1.9 book - Part 39 of 210
The Ring programming language version 1.9 book - Part 39 of 210
 
All about scala
All about scalaAll about scala
All about scala
 
Iphone course 1
Iphone course 1Iphone course 1
Iphone course 1
 
Java ppt Gandhi Ravi (gandhiri@gmail.com)
Java ppt  Gandhi Ravi  (gandhiri@gmail.com)Java ppt  Gandhi Ravi  (gandhiri@gmail.com)
Java ppt Gandhi Ravi (gandhiri@gmail.com)
 

Similar to JS Fest 2019. Max Koretskiy. A sneak peek into super optimized code in JS frameworks

Pharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source SmalltalkPharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source Smalltalk
Serge Stinckwich
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
Codemotion
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
Eduard Tomàs
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
ColdFusionConference
 
Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin Shanghai
Jackson Tian
 
Why Node.js
Why Node.jsWhy Node.js
Why Node.js
guileen
 
The Ring programming language version 1.5.2 book - Part 10 of 181
The Ring programming language version 1.5.2 book - Part 10 of 181The Ring programming language version 1.5.2 book - Part 10 of 181
The Ring programming language version 1.5.2 book - Part 10 of 181
Mahmoud Samir Fayed
 
Adopting F# at SBTech
Adopting F# at SBTechAdopting F# at SBTech
Adopting F# at SBTech
Antya Dev
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
Serge Stinckwich
 
"Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin "Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin
Vasil Remeniuk
 
Comet with node.js and V8
Comet with node.js and V8Comet with node.js and V8
Comet with node.js and V8
amix3k
 
J Query The Write Less Do More Javascript Library
J Query   The Write Less Do More Javascript LibraryJ Query   The Write Less Do More Javascript Library
J Query The Write Less Do More Javascript Library
rsnarayanan
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
darrelmiller71
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
Tarek Yehia
 
The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185
Mahmoud Samir Fayed
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
Skills Matter
 
HashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin InfrastructureHashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin Infrastructure
Nicolas Corrarello
 
react-slides.pdf
react-slides.pdfreact-slides.pdf
react-slides.pdf
DayNightGaMiNg
 
react-slides.pdf gives information about react library
react-slides.pdf gives information about react libraryreact-slides.pdf gives information about react library
react-slides.pdf gives information about react library
janet736113
 
The Ring programming language version 1.4.1 book - Part 29 of 31
The Ring programming language version 1.4.1 book - Part 29 of 31The Ring programming language version 1.4.1 book - Part 29 of 31
The Ring programming language version 1.4.1 book - Part 29 of 31
Mahmoud Samir Fayed
 

Similar to JS Fest 2019. Max Koretskiy. A sneak peek into super optimized code in JS frameworks (20)

Pharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source SmalltalkPharo, an innovative and open-source Smalltalk
Pharo, an innovative and open-source Smalltalk
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
 
JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)JavaScript in 2016 (Codemotion Rome)
JavaScript in 2016 (Codemotion Rome)
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Why Nodejs Guilin Shanghai
Why Nodejs Guilin ShanghaiWhy Nodejs Guilin Shanghai
Why Nodejs Guilin Shanghai
 
Why Node.js
Why Node.jsWhy Node.js
Why Node.js
 
The Ring programming language version 1.5.2 book - Part 10 of 181
The Ring programming language version 1.5.2 book - Part 10 of 181The Ring programming language version 1.5.2 book - Part 10 of 181
The Ring programming language version 1.5.2 book - Part 10 of 181
 
Adopting F# at SBTech
Adopting F# at SBTechAdopting F# at SBTech
Adopting F# at SBTech
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
 
"Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin "Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin
 
Comet with node.js and V8
Comet with node.js and V8Comet with node.js and V8
Comet with node.js and V8
 
J Query The Write Less Do More Javascript Library
J Query   The Write Less Do More Javascript LibraryJ Query   The Write Less Do More Javascript Library
J Query The Write Less Do More Javascript Library
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
 
Art of Javascript
Art of JavascriptArt of Javascript
Art of Javascript
 
The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185The Ring programming language version 1.5.4 book - Part 15 of 185
The Ring programming language version 1.5.4 book - Part 15 of 185
 
Clojure And Swing
Clojure And SwingClojure And Swing
Clojure And Swing
 
HashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin InfrastructureHashiCorp Vault Plugin Infrastructure
HashiCorp Vault Plugin Infrastructure
 
react-slides.pdf
react-slides.pdfreact-slides.pdf
react-slides.pdf
 
react-slides.pdf gives information about react library
react-slides.pdf gives information about react libraryreact-slides.pdf gives information about react library
react-slides.pdf gives information about react library
 
The Ring programming language version 1.4.1 book - Part 29 of 31
The Ring programming language version 1.4.1 book - Part 29 of 31The Ring programming language version 1.4.1 book - Part 29 of 31
The Ring programming language version 1.4.1 book - Part 29 of 31
 

More from JSFestUA

JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JSFestUA
 
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript PerformanceJS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JSFestUA
 
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JSFestUA
 
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JSFestUA
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JSFestUA
 
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JSFestUA
 
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstackJS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JSFestUA
 
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JSFestUA
 
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JSFestUA
 
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developersJS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JSFestUA
 
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JSFestUA
 
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JSFestUA
 
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the ScaleJS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JSFestUA
 
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratchJS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JSFestUA
 
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотятJS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JSFestUA
 
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for RustJS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JSFestUA
 
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JSFestUA
 
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проектіJS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JSFestUA
 
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядроJS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JSFestUA
 
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JSFestUA
 

More from JSFestUA (20)

JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in productionJS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
JS Fest 2019/Autumn. Роман Савіцький. Webcomponents & lit-element in production
 
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript PerformanceJS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
JS Fest 2019/Autumn. Erick Wendel. 10 secrets to improve Javascript Performance
 
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
JS Fest 2019/Autumn. Alexandre Gomes. Embrace the "react fatigue"
 
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
JS Fest 2019/Autumn. Anton Cherednikov. Choreographic or orchestral architect...
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
 
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
JS Fest 2019/Autumn. Marko Letic. Saving the world with JavaScript: A Data Vi...
 
JS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstackJS Fest 2019/Autumn. Александр Товмач. JAMstack
JS Fest 2019/Autumn. Александр Товмач. JAMstack
 
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
JS Fest 2019/Autumn. Влад Федосов. Technology agnostic microservices at SPA f...
 
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
 
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developersJS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
JS Fest 2019/Autumn. Maciej Treder. Angular Schematics - Develop for developers
 
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
JS Fest 2019/Autumn. Kyle Boss. A Tinder Love Story: Create a Wordpress Blog ...
 
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
JS Fest 2019/Autumn. Андрей Старовойт. Зачем нужен тип "true" в TypeScript?
 
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the ScaleJS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
JS Fest 2019/Autumn. Eyal Eizenberg. Tipping the Scale
 
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratchJS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
JS Fest 2019/Autumn. Sota Ohara. Сreate own server less CMS from scratch
 
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотятJS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
JS Fest 2019/Autumn. Джордж Евтушенко. Как стать программистом, которого хотят
 
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for RustJS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
JS Fest 2019/Autumn. Алексей Орленко. Node.js N-API for Rust
 
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
JS Fest 2019/Autumn. Daniel Ostrovsky. Falling in love with decorators ES6/Ty...
 
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проектіJS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
JS Fest 2019/Autumn. Андрей Андрийко. Гексагональна архітектура в Nodejs проекті
 
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядроJS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
JS Fest 2019/Autumn. Борис Могила. Svelte. Почему нам не нужно run-time ядро
 
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
JS Fest 2019/Autumn. Виталий Кухар. Сравнение кластеризации HTTP, TCP и UDP н...
 

Recently uploaded

THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...
THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...
THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...
indexPub
 
Oliver Asks for More by Charles Dickens (9)
Oliver Asks for More by Charles Dickens (9)Oliver Asks for More by Charles Dickens (9)
Oliver Asks for More by Charles Dickens (9)
nitinpv4ai
 
Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47
MysoreMuleSoftMeetup
 
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
Nguyen Thanh Tu Collection
 
Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...
Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...
Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...
ImMuslim
 
Bossa N’ Roll Records by Ismael Vazquez.
Bossa N’ Roll Records by Ismael Vazquez.Bossa N’ Roll Records by Ismael Vazquez.
Bossa N’ Roll Records by Ismael Vazquez.
IsmaelVazquez38
 
Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"
National Information Standards Organization (NISO)
 
Gender and Mental Health - Counselling and Family Therapy Applications and In...
Gender and Mental Health - Counselling and Family Therapy Applications and In...Gender and Mental Health - Counselling and Family Therapy Applications and In...
Gender and Mental Health - Counselling and Family Therapy Applications and In...
PsychoTech Services
 
Wound healing PPT
Wound healing PPTWound healing PPT
Wound healing PPT
Jyoti Chand
 
Leveraging Generative AI to Drive Nonprofit Innovation
Leveraging Generative AI to Drive Nonprofit InnovationLeveraging Generative AI to Drive Nonprofit Innovation
Leveraging Generative AI to Drive Nonprofit Innovation
TechSoup
 
Standardized tool for Intelligence test.
Standardized tool for Intelligence test.Standardized tool for Intelligence test.
Standardized tool for Intelligence test.
deepaannamalai16
 
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdfREASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
giancarloi8888
 
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
Nguyen Thanh Tu Collection
 
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
GeorgeMilliken2
 
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptxNEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
iammrhaywood
 
Philippine Edukasyong Pantahanan at Pangkabuhayan (EPP) Curriculum
Philippine Edukasyong Pantahanan at Pangkabuhayan (EPP) CurriculumPhilippine Edukasyong Pantahanan at Pangkabuhayan (EPP) Curriculum
Philippine Edukasyong Pantahanan at Pangkabuhayan (EPP) Curriculum
MJDuyan
 
Juneteenth Freedom Day 2024 David Douglas School District
Juneteenth Freedom Day 2024 David Douglas School DistrictJuneteenth Freedom Day 2024 David Douglas School District
Juneteenth Freedom Day 2024 David Douglas School District
David Douglas School District
 
How to Predict Vendor Bill Product in Odoo 17
How to Predict Vendor Bill Product in Odoo 17How to Predict Vendor Bill Product in Odoo 17
How to Predict Vendor Bill Product in Odoo 17
Celine George
 
Skimbleshanks-The-Railway-Cat by T S Eliot
Skimbleshanks-The-Railway-Cat by T S EliotSkimbleshanks-The-Railway-Cat by T S Eliot
Skimbleshanks-The-Railway-Cat by T S Eliot
nitinpv4ai
 
SWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptxSWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptx
zuzanka
 

Recently uploaded (20)

THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...
THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...
THE SACRIFICE HOW PRO-PALESTINE PROTESTS STUDENTS ARE SACRIFICING TO CHANGE T...
 
Oliver Asks for More by Charles Dickens (9)
Oliver Asks for More by Charles Dickens (9)Oliver Asks for More by Charles Dickens (9)
Oliver Asks for More by Charles Dickens (9)
 
Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47Mule event processing models | MuleSoft Mysore Meetup #47
Mule event processing models | MuleSoft Mysore Meetup #47
 
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
BÀI TẬP BỔ TRỢ TIẾNG ANH LỚP 9 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2024-2025 - ...
 
Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...
Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...
Geography as a Discipline Chapter 1 __ Class 11 Geography NCERT _ Class Notes...
 
Bossa N’ Roll Records by Ismael Vazquez.
Bossa N’ Roll Records by Ismael Vazquez.Bossa N’ Roll Records by Ismael Vazquez.
Bossa N’ Roll Records by Ismael Vazquez.
 
Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"Benner "Expanding Pathways to Publishing Careers"
Benner "Expanding Pathways to Publishing Careers"
 
Gender and Mental Health - Counselling and Family Therapy Applications and In...
Gender and Mental Health - Counselling and Family Therapy Applications and In...Gender and Mental Health - Counselling and Family Therapy Applications and In...
Gender and Mental Health - Counselling and Family Therapy Applications and In...
 
Wound healing PPT
Wound healing PPTWound healing PPT
Wound healing PPT
 
Leveraging Generative AI to Drive Nonprofit Innovation
Leveraging Generative AI to Drive Nonprofit InnovationLeveraging Generative AI to Drive Nonprofit Innovation
Leveraging Generative AI to Drive Nonprofit Innovation
 
Standardized tool for Intelligence test.
Standardized tool for Intelligence test.Standardized tool for Intelligence test.
Standardized tool for Intelligence test.
 
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdfREASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
REASIGNACION 2024 UGEL CHUPACA 2024 UGEL CHUPACA.pdf
 
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
BÀI TẬP DẠY THÊM TIẾNG ANH LỚP 7 CẢ NĂM FRIENDS PLUS SÁCH CHÂN TRỜI SÁNG TẠO ...
 
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
 
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptxNEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
 
Philippine Edukasyong Pantahanan at Pangkabuhayan (EPP) Curriculum
Philippine Edukasyong Pantahanan at Pangkabuhayan (EPP) CurriculumPhilippine Edukasyong Pantahanan at Pangkabuhayan (EPP) Curriculum
Philippine Edukasyong Pantahanan at Pangkabuhayan (EPP) Curriculum
 
Juneteenth Freedom Day 2024 David Douglas School District
Juneteenth Freedom Day 2024 David Douglas School DistrictJuneteenth Freedom Day 2024 David Douglas School District
Juneteenth Freedom Day 2024 David Douglas School District
 
How to Predict Vendor Bill Product in Odoo 17
How to Predict Vendor Bill Product in Odoo 17How to Predict Vendor Bill Product in Odoo 17
How to Predict Vendor Bill Product in Odoo 17
 
Skimbleshanks-The-Railway-Cat by T S Eliot
Skimbleshanks-The-Railway-Cat by T S EliotSkimbleshanks-The-Railway-Cat by T S Eliot
Skimbleshanks-The-Railway-Cat by T S Eliot
 
SWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptxSWOT analysis in the project Keeping the Memory @live.pptx
SWOT analysis in the project Keeping the Memory @live.pptx
 

JS Fest 2019. Max Koretskiy. A sneak peek into super optimized code in JS frameworks

  • 1. Why Angular and React are so fast? Max Koretskyi aka Wizard Developer Advocate
  • 2. 2015 20162014 2017 2018 A failed startup that made me learn to program and gave broad programming experience SO activity that build my knowledge base and created a foundation for blogging Angular In Depth that helped me build strong community and establish reputation as an Angular expert Public speaking that helped me meet awesome people and become GDE and MVP Developer Advocate job that allows me to to develop programming and marketing skills at the same time where 100-hour work weeks got me in 5 years
  • 4. Monomorphism Bit fields & Bit masks Bloom filters Benedikt Meurer, V8 optimizations lead engineer Alex Rickabught, Angular core team Dan Ambramov, React core team Kudos to Optimization techniques in Angular and React
  • 5. We use one type for all View nodes so that property access in loops stay monomorphic! Misko Hevery, technical lead of Angular Angular sources comments
  • 6. Fiber node … shares the same hidden class. Never add fields outside of construction in `ReactFiber` Contributing To React Fiber guidelines Sebastian Markbåge, technical lead of React
  • 7. • What is hidden class and why is it shared by fiber and view nodes? Questions we need to answer • What is monomophic property access and why is it important? • What is a fiber node in React & a view node in Angular?
  • 8. Representing a template in Angular @Component({ template: ` <h1>The title is: {{title}}</h1> <h2>My hero is: {{hero}}</h2> ` }) export class AppComponent { title = 'Tour of Heroes'; hero = 'Windstorm'; } Type: h1 Type: h2 View Nodes bindings: { text: "Tour of Heroes" } bindings: { text: " 'Windstorm" }
  • 9. Representing a template in React class App extends Component { state = { title: 'Tour of Heroes', hero: 'Windstorm' }; render() { return ( [ <h1>The title is: {this.state.title}</h1>, <h2>My hero is: {this.state.hero}</h2> ] ) } } Type: h1 Type: h2 props: { children: "Tour of Heroes" } props: { children: " Windstorm " } Fiber Nodes
  • 10. Fiber and View nodes are used a lot when processing changes properties could easily be accessed over 10 000* times function updateNode(node, …) { let value = node.property; } *100 components x 10 elements x 10 function calls
  • 11. Locating value of an object's property in memory is a complicated process
  • 12. let object = { x: 5, y: 6 }; JSObject 5 6 Property information Offset: 0 [[Writable]]: true [[Enumerable]]: true [[Configurable]]: true Shape 'x' 'y' Property information Offset: 1 [[Writable]]: true [[Enumerable]]: true [[Configurable]]: true Shapes aka Hidden Class (Maps in V8)
  • 13. let object = { x: 5, y: 6 }; JSObject 5 6 Property information Offset: 0 ... Shape 'x' 'y' Property information Offset: 1 ... Location in memory with offsets 0 0 0 0 0 1 1 00 0 0 0 0 1 0 1 property `x` address offset 0 bytes 5 property `y` address offset 1 byte 6 object pointer
  • 14. Why do we need shapes?
  • 15. 5 6 JSObject a Property information Shape 'x' 'y' Property information JSObject b 7 8 let a = { x: 5, y: 6 }; let b = { x: 7, y: 8 }; Shapes help reduce memory footprint
  • 16. let a = { x: 5, y: 6 } let b = { x: 7, y: 8 } b.w = 9; b.z = 10; JSObject a 5 6 Shape 'x' 'y' JSObject b 7 8 Shape 'w' Shape 'z' 9 10 Transition chains
  • 18. getX({x: a}) function getX(o) { return o.x; } Optimization through Inline Cache shape offsetstate function 'getX' feedback vector xmono Property information Offset: 0 ... Shape(x) 'x' 0
  • 19. Monomorphic property access getX(a); getX(b); getX(c); function getX(o) { return o.x; } let a = { x: 5, y: 6 }; let b = { x: 7, y: 8 }; let b = { x: 7, y: 8 }; a function only saw one type of a shape
  • 20. Polymorphic property access getX(a); getX(b); getX(c); getX(D); function getX(o) { return o.x; } let a = {x: 5, y: 6}; let b = {y: 7, x: 8}; // different order let b = {y: 7, x: 8, z: 5}; // new properties let d = Object.create({}, {}; // different prototype a function only saw up to 4 different types of a shape
  • 21. Megamorphic property access Monomorphic prop access maybe up to 100 times faster than megamorphic. a function saw more than 4 different types of a shape
  • 22. Frameworks enforce the same shape (hidden class) for fiber and view nodes to enable monomorphic property access
  • 23. Template node types Fiber node (React) Template element View node (Angular) HostComponent HTMLElementNode TypeElement HostText HTMLTextNode TypeText FunctionComponent, ClassComponent Component Component
  • 24. type Element { fieldA; fieldB; } type Text { fieldC; field; } type Component { fieldE; fieldF; } Property access is not monormophic type Node { tag: nodeType; fieldA | null; fieldB | null; fieldC | null; fieldD | null; fieldE | null; fieldF | null; } Property access is monormophic
  • 25. type Fiber { tag: integer, ... } interface NodeDef { flags: bitfield; ... } FunctionComponent = 0; ClassComponent = 1; IndeterminateComponent = 2; HostRoot = 3; HostPortal = 4; HostComponent = 5; HostText = 6; Fragment = 7; … None = 0, TypeElement = 1 << 0, TypeText = 1 << 1, ProjectedTemplate = 1 << 2, ... TypeDirective = 1 << 14, Component = 1 << 15, Type definitions in Angular and React
  • 26. function beginWork(fiberNode, ...) { ... switch (fiberNode.tag) { case FunctionalComponent: {...} case ClassComponent: {...} case HostComponent: return updateHostComponent(fiberNode, ...); case ... } } Branching by node type in React
  • 27. Bit fields (vector) & Bit masks
  • 28. Bit field is just an array of bits let bitField = 0b01010001; // 81 0 1 0 1 0 0 0 1
  • 29. React uses bit fields to encode effects
  • 30. Effects in React Fiber architecture • Render phase (build a list of effects) • Process changes from setState • Update props on child elements • Call lifecycle methods (shouldComponentUpdate etc.) The result of the phase is a tree of fiber nodes marked with side-effects. • Commit phase (apply effects) • Update DOM • Call lifecycle methods (componentDidUpdate etc.) • Update refs
  • 31. Before render phase: After render phase: 4..toString(2) = 100 type: 'span' effectTag: 0 type: 'span' effectTag: 4 const effectTags = { Placement = : 0b000010; Update : 0b000100; PlacementAndUpdate : 0b000110; ... } 0 0 0 1 0 0 PlacementUpdate
  • 32. let effectTag = 0b00000000; 0 0 0 0 0 0 0 0 effectTag = effectTag | effectTags.Update; 0 0 0 0 0 1 0 0 Write with bitwise OR Define bitfield isUpdateEffectSet = !! (effectTag & effectTags.Update); Check with bitwise AND
  • 33. Branching by effect in React function updateHostEffects(fiberNode) { ... const effectTag = fiberNode.effectTag; if (effectTag & effectTags.Placement) { ... } if (effectTag & effectTags.PlacementAndUpdate) { ... } if (effectTag & effectTags.Update) { ... } ... }
  • 34. Encoding objects in bit fields let user = { first: true, group: 20, sortKey: 347843 }; allocations in memory for: • a standard JS object • a shape with keys metadata • 3 values stored in the keys
  • 35. Any way to avoid those allocations?
  • 36. Encoding objects in bit fields Field Restrictions on values Bits required sortKey less than 1M 20 (220 > 1M) group less than 50 6 (26 = 64) first boolean 1 00000 0 000000 0000000000000000000 sortKeygroupfirst 32 bits
  • 37. Encoding objects in bit fields let user = 0x 05454ec3; let user = 0b 00000 1 010100 001010100111011000011; let user = { first: true, group: 20, sortKey: 347843 }; Field Decimal Binary sortKey 347843 001010100111011000011 group 20 010100 first true 1
  • 39. • millions of allocations for objects and values 1 million of objects require VS • one typed array for one million 32-integer values Regular JS object Encoded in a bitfield • a ton of GC (garbage collection) cleanup after each iteration • much larger and potentially fragmented memory usage • almost zero garbage collection • smaller and contiguous memory usage
  • 40. Bloom filters is element in the set? DEFINITELY NO 100% probability MAYBE varying probability data structure that answers the question
  • 41. 0 0 0 0 1 0 Is element in a set? Is bits [n1,n2…n] set? Each element is encoded in a bit field let value = "Jonh"; calculateBitNumber(value); // 2
  • 42. John (2) 0 0 0 0 0 0 0 0 Anna (1)Tom (4) [ "John", "Anna", "Tom" ] let calculateBitValue = (value) => value.charCodeAt(0) % 8 111
  • 43. Why "yes" is not guaranteed?
  • 44. Anna (1) 0 0 0 0 1 0 1 1 collisions Tom (4) John (2) Jane (2) Less slots, more collisions
  • 46. Anna (1,6) 0 1 1 0 1 0 1 1 no collisions Tom (4,7) John (2,7) Jane (2,1) Less slots, more collisions
  • 47. Where does Angular use this? Dependency Injection mechanism
  • 50. Bloom filters Injector Dashboard component Widget component SiteAnalytics component WidgetManager WidgetManager Injector Is here? no – go up Is here? no – go up resolve Injector Bloom filter Bloom filter Bloom filter Is here? maybe – chec injector
  • 51. How does Angular implement bloom filters?
  • 52. Bloom filter is 256 bits in length 8 buckets 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits 32 bits
  • 53. A plain counter modulo of 256 to generate hash let counter = 0; function calculateBitValue() { let hash = counter % 256; counter = counter + 1; return hash; } let bitValue1 = calculateBitValue(); // 0 let bitValue2 = calculateBitValue(); // 1 ... let bitValue256 = calculateBitValue(); // 0 let bitValue257 = calculateBitValue(); // 1
  • 54. No collisions with less than 256 services per Injector "yes" answer is 100%
  • 56. Depth 15th of June, 2019 first Angular conference in Kyiv angular-in-depth.org Angular in
  • 58. Follow me to learn fundamentals maxkoretskyi maxkoretskyi maxkoretskyi.com

Editor's Notes

  1. The problem is collisions. 2 letters. Hash functions are usually used to produce some number. But it can be anything. Even a simple counter. And that's what Angular does.
  2. The problem is collisions. 2 letters. Hash functions are usually used to produce some number. But it can be anything. Even a simple counter. And that's what Angular does.
  3. If you have any questions, I'll be sitting in the experts room tomorrow at 3 pm. Or you can catch me in the hallways, I'll be wearing this T-shirt so you can recognize me.
  4. For more in-depth information follow me on Twitter. I promise I won’t waste your time. I’ll write a follow-up article on change detection. So stay tuned and expect some tweets about it quite soon.