SlideShare a Scribd company logo
JavaScript Engines
Essentials for Developers
ViennaJS
31.1.2018
Rainer Hahnekamp
https://www.rainerhahnekamp.com
@rainerhahnekamp
rainer.hahnekamp@gmail.com
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Code Example 1: Execution Time ~ 1.2s
(() => {
let han = {firstname: "Han", lastname: "Solo"};
let luke = {firstname: "Luke", lastname: "Skywalker"};
let leia = {firstname: "Leia", lastname: "Organa"};
let obi = {firstname: "Obi", lastname: "Wan"};
let persons = [
han, luke, leia, obi,
han, luke, leia, obi];
let getName = (person) => person.lastname;
console.time("engine");
for(var i = 0; i < 1000 * 1000 * 1000; i++) {
getName(persons[i & 7]);
}
console.timeEnd("engine");
})();
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Code Example 2: Execution Time ~ 1.8s
(() => {
let han = {firstname: "Han", lastname: "Solo", spaceship: "Falcon"};
let luke = {firstname: "Luke", lastname: "Skywalker"};
let leia = {firstname: "Leia", lastname: "Organa"};
let obi = {firstname: "Obi", lastname: "Wan"};
let persons = [
han, luke, leia, obi,
han, luke, leia, obi];
let getName = (person) => person.lastname;
console.time("engine");
for(var i = 0; i < 1000 * 1000 * 1000; i++) {
getName(persons[i & 7]);
}
console.timeEnd("engine");
})();
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Code Example 3: Execution Time ~ 8.4s
(() => {
let han = {firstname: "Han", lastname: "Solo", spacecraft: "Falcon"};
let luke = {firstname: "Luke", lastname: "Skywalker", job: "Jedi"};
let leia = {firstname: "Leia", lastname: "Organa", gender: "female"};
let obi = {firstname: "Obi", lastname: "Wan", retired: true};
let yoda = {lastname: "Yoda"};
let persons = [
han, luke, leia, obi,
yoda, luke, leia, obi];
let getName = (person) => person.lastname;
console.time("engine");
for(var i = 0; i < 1000 * 1000 * 1000; i++) {
getName(persons[i & 7]);
}
console.timeEnd("engine");
})();
Rainer Hahnekamp @ ViennaJS, 31. January 2017
What is a JavaScript Engine
● Executes JavaScript Source Code
● Bundled in the browser, but can be run separately
● It is not the Rendering Engine
● Until V8 only interpreted
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Design of Modern Engines
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Design of Modern Engines
let getName = (person) => person.lastname;
let han = {firstname: "Han", lastname: "Solo"};
let luke = {firstname: "Luke", lastname: "Skywalker"};
let leia = {firstname: "Leia", lastname: "Organa"};
let obi = {firstname: "Obi", lastname: "Wan"};
let persons = [han, luke, leia, obi];
for(var i = 0; i < 1000 * 1000 * 1000; i++) {
getName(persons[i & 3]);
}
Source Code
JavaScript Engine
Interpreter
Compiler (JIT)
Machine CodeOptimisation Step
Optimisation Step
Optimisation Step
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Integrating Static Types
during Runtime
Inline Caching
http://www.taproot.com/archives/60650
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Execution as Interpreter (Pre V8 Time)
function getName(person)
han
firstname lastname
luke
firstname lastname
leia
firstname lastname
obi
firstname lastname
lastname
1. search for memory location of
property lastname
2. return value of lastname
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Interpreter with Hidden Classes
function getName(person)
han
firstname lastname
luke
firstname lastname
leia
firstname lastname
obi
firstname lastname
lastname
1. search for memory location of
property lastname
2. return value of lastname
Recording all hidden
classes passed to that
function.
Hidden Class: p1
firstname
lastname
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Compilation Phase
function getName(person)
1. search for memory location of
property lastname
2. return value of lastname
only hidden class p1
is passed
Just-in-Time Compiler
function getName(person: p1)
1. return known location of
lastname from p1
Machine Code
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Optimised & Compiled Code with
Monomorphic Inline Cache
function getName(person: p1)
han
firstname lastname
luke
firstname lastname
leia
firstname lastname
obi
firstname lastname
lastname
1. return known location of lastname
from p1
Hidden Class: p1
firstname
lastname
Machine Code
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Optimised & Compiled Code with
Polymorphic Inline Cache
function getName(person: p1 | p2)
han
firstname
lastname
luke
firstname lastname
leia
firstname lastname
obi
firstname lastname
lastname
1. if person is p1, return known from
p1
2. if person is p2, return known
location from p2
Hidden Class: p1
firstname
lastname
Machine Code
spaceship
Hidden Class: p2
spaceship
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Inline Caching
● Monomorphic
○ Hidden Classes: 1
○ Duration: 1.2s
● Polymorphic
○ Hidden Classes: 2 - 4
○ Duration: 1.8s - 2.4s
● Megamorphic
○ Hidden Classes: > 4
○ Duration: 8.4s
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Code Example 4: Execution Time ~ 1.2s
(() => {
class Person {
constructor(firstname, lastname, spaceship, job, gender, retired) {
this.firstname = firstname;
this.lastname = lastname;
this.spaceship = spaceship;
this.job = job;
this.gender = gender;
this.retired = retired;
}
}
let han = new Person("Han", "Solo", "Falcon");
let luke = new Person("Luke", "Skywalker", null, "Jedi");
let leia = new Person("Leia", "Organa", null, null, "female");
let obi = new Person("Obi", "Wan", null, null, null, true);
let yoda = new Person(null, "Yoda");
let persons = [han, luke, leia, obi, yoda, luke, leia, obi];
let getName = (person) => person.lastname;
console.time("engine");
for(var i = 0; i < 1000 * 1000 * 1000; i++) {
getName(persons[i & 7]);
}
console.timeEnd("engine");
})();
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Final Advice
● Use Classes instead of object literals
● Use a Transpiler with support for Static Types (TypeScript,...)
● Don’t outsmart the Engine
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Further Reading 1/2
● David Mark Clements: Performance Killers for TurboShift and Ignition:
https://github.com/davidmarkclements/v8-perf
● Victor Felder: JavaScript Engines Hidden Classes
https://draft.li/blog/2016/12/22/javascript-engines-hidden-classes
● Jörg W. Mittag: Overview of JIT Compiler and Interpreter
https://softwareengineering.stackexchange.com/questions/246094/understanding-
the-differences-traditional-interpreter-jit-compiler-jit-interp/269878#269878
● Vyacheslav Egorov: What’s up with Monomorphism
http://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html
Rainer Hahnekamp @ ViennaJS, 31. January 2017
Further Reading 2/2
● WebComic explaining Google Chrome
https://www.google.com/googlebooks/chrome/big_00.html
● Huiren Woo: Differences between V8 and ChakraCore
https://developers.redhat.com/blog/2016/05/31/javascript-engine-performance-comparison-
v8-charkra-chakra-core-2/
● Seth Thompson: V8, Advanced JavaScript, & the Next Performance Frontier
https://www.youtube.com/watch?v=EdFDJANJJLs
● Franziska Hinkelmann - Performance Profiling for V8
https://www.youtube.com/watch?v=j6LfSlg8Fig
● Benedikt Meurer: An Introduction to Speculative Optimization in V8
https://ponyfoo.com/articles/an-introduction-to-speculative-optimization-in-v8

More Related Content

What's hot

Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...
Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...
Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...
Oleksiy Panchenko
 
LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017
Matthew Beale
 
distributed tracing in 5 minutes
distributed tracing in 5 minutesdistributed tracing in 5 minutes
distributed tracing in 5 minutes
Dan Kuebrich
 
Logstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Logstash + Elasticsearch + Kibana Presentation on Startit Tech MeetupLogstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Logstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Startit
 
'Scalable Logging and Analytics with LogStash'
'Scalable Logging and Analytics with LogStash''Scalable Logging and Analytics with LogStash'
'Scalable Logging and Analytics with LogStash'
Cloud Elements
 
JavaScript in 2015
JavaScript in 2015JavaScript in 2015
JavaScript in 2015
Igor Laborie
 
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Airat Khisamov
 
Collect distributed application logging using fluentd (EFK stack)
Collect distributed application logging using fluentd (EFK stack)Collect distributed application logging using fluentd (EFK stack)
Collect distributed application logging using fluentd (EFK stack)
Marco Pas
 
Attack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaAttack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and Kibana
Prajal Kulkarni
 
Logstash-Elasticsearch-Kibana
Logstash-Elasticsearch-KibanaLogstash-Elasticsearch-Kibana
Logstash-Elasticsearch-Kibana
dknx01
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logs
SmartLogic
 
How ElasticSearch lives in my DevOps life
How ElasticSearch lives in my DevOps lifeHow ElasticSearch lives in my DevOps life
How ElasticSearch lives in my DevOps life
琛琳 饶
 
"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017
Alex Borysov
 
Using Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibanaUsing Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibana
Alejandro E Brito Monedero
 
Scaling an ELK stack at bol.com
Scaling an ELK stack at bol.comScaling an ELK stack at bol.com
Scaling an ELK stack at bol.com
Renzo Tomà
 
Subversion To Mercurial
Subversion To MercurialSubversion To Mercurial
Subversion To Mercurial
Ladislav Prskavec
 
Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...
Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...
Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...
ForgeRock
 
Scala - den smarta kusinen
Scala - den smarta kusinenScala - den smarta kusinen
Scala - den smarta kusinen
Redpill Linpro
 
Puppetcamp Melbourne - puppetdb
Puppetcamp Melbourne - puppetdbPuppetcamp Melbourne - puppetdb
Puppetcamp Melbourne - puppetdb
m_richardson
 
ELK stack at weibo.com
ELK stack at weibo.comELK stack at weibo.com
ELK stack at weibo.com
琛琳 饶
 

What's hot (20)

Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...
Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...
Elasticsearch, Logstash, Kibana. Cool search, analytics, data mining and more...
 
LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017
 
distributed tracing in 5 minutes
distributed tracing in 5 minutesdistributed tracing in 5 minutes
distributed tracing in 5 minutes
 
Logstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Logstash + Elasticsearch + Kibana Presentation on Startit Tech MeetupLogstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
Logstash + Elasticsearch + Kibana Presentation on Startit Tech Meetup
 
'Scalable Logging and Analytics with LogStash'
'Scalable Logging and Analytics with LogStash''Scalable Logging and Analytics with LogStash'
'Scalable Logging and Analytics with LogStash'
 
JavaScript in 2015
JavaScript in 2015JavaScript in 2015
JavaScript in 2015
 
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
Central LogFile Storage. ELK stack Elasticsearch, Logstash and Kibana.
 
Collect distributed application logging using fluentd (EFK stack)
Collect distributed application logging using fluentd (EFK stack)Collect distributed application logging using fluentd (EFK stack)
Collect distributed application logging using fluentd (EFK stack)
 
Attack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and KibanaAttack monitoring using ElasticSearch Logstash and Kibana
Attack monitoring using ElasticSearch Logstash and Kibana
 
Logstash-Elasticsearch-Kibana
Logstash-Elasticsearch-KibanaLogstash-Elasticsearch-Kibana
Logstash-Elasticsearch-Kibana
 
Logstash: Get to know your logs
Logstash: Get to know your logsLogstash: Get to know your logs
Logstash: Get to know your logs
 
How ElasticSearch lives in my DevOps life
How ElasticSearch lives in my DevOps lifeHow ElasticSearch lives in my DevOps life
How ElasticSearch lives in my DevOps life
 
"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017"Enabling Googley microservices with gRPC" at JDK.IO 2017
"Enabling Googley microservices with gRPC" at JDK.IO 2017
 
Using Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibanaUsing Logstash, elasticsearch & kibana
Using Logstash, elasticsearch & kibana
 
Scaling an ELK stack at bol.com
Scaling an ELK stack at bol.comScaling an ELK stack at bol.com
Scaling an ELK stack at bol.com
 
Subversion To Mercurial
Subversion To MercurialSubversion To Mercurial
Subversion To Mercurial
 
Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...
Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...
Customer Intelligence: Using the ELK Stack to Analyze ForgeRock OpenAM Audit ...
 
Scala - den smarta kusinen
Scala - den smarta kusinenScala - den smarta kusinen
Scala - den smarta kusinen
 
Puppetcamp Melbourne - puppetdb
Puppetcamp Melbourne - puppetdbPuppetcamp Melbourne - puppetdb
Puppetcamp Melbourne - puppetdb
 
ELK stack at weibo.com
ELK stack at weibo.comELK stack at weibo.com
ELK stack at weibo.com
 

Recently uploaded

Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Pitangent Analytics & Technology Solutions Pvt. Ltd
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
ScyllaDB
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
Alex Pruden
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
DianaGray10
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
Fwdays
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
Jakub Marek
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
Fwdays
 
Christine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptxChristine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptx
christinelarrosa
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
MichaelKnudsen27
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
Miro Wengner
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
Fwdays
 
High performance Serverless Java on AWS- GoTo Amsterdam 2024
High performance Serverless Java on AWS- GoTo Amsterdam 2024High performance Serverless Java on AWS- GoTo Amsterdam 2024
High performance Serverless Java on AWS- GoTo Amsterdam 2024
Vadym Kazulkin
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
Neo4j
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
operationspcvita
 
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham HillinQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
LizaNolte
 
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
saastr
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
christinelarrosa
 

Recently uploaded (20)

Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
Crafting Excellence: A Comprehensive Guide to iOS Mobile App Development Serv...
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
 
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin..."$10 thousand per minute of downtime: architecture, queues, streaming and fin...
"$10 thousand per minute of downtime: architecture, queues, streaming and fin...
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)Main news related to the CCS TSI 2023 (2023/1695)
Main news related to the CCS TSI 2023 (2023/1695)
 
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk"Frontline Battles with DDoS: Best practices and Lessons Learned",  Igor Ivaniuk
"Frontline Battles with DDoS: Best practices and Lessons Learned", Igor Ivaniuk
 
Christine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptxChristine's Product Research Presentation.pptx
Christine's Product Research Presentation.pptx
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
 
JavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green MasterplanJavaLand 2024: Application Development Green Masterplan
JavaLand 2024: Application Development Green Masterplan
 
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
"Scaling RAG Applications to serve millions of users",  Kevin Goedecke"Scaling RAG Applications to serve millions of users",  Kevin Goedecke
"Scaling RAG Applications to serve millions of users", Kevin Goedecke
 
High performance Serverless Java on AWS- GoTo Amsterdam 2024
High performance Serverless Java on AWS- GoTo Amsterdam 2024High performance Serverless Java on AWS- GoTo Amsterdam 2024
High performance Serverless Java on AWS- GoTo Amsterdam 2024
 
Leveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and StandardsLeveraging the Graph for Clinical Trials and Standards
Leveraging the Graph for Clinical Trials and Standards
 
The Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptxThe Microsoft 365 Migration Tutorial For Beginner.pptx
The Microsoft 365 Migration Tutorial For Beginner.pptx
 
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham HillinQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
inQuba Webinar Mastering Customer Journey Management with Dr Graham Hill
 
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
Christine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptxChristine's Supplier Sourcing Presentaion.pptx
Christine's Supplier Sourcing Presentaion.pptx
 

JavaScript Engines: Essentials for Developers

  • 1. JavaScript Engines Essentials for Developers ViennaJS 31.1.2018 Rainer Hahnekamp https://www.rainerhahnekamp.com @rainerhahnekamp rainer.hahnekamp@gmail.com
  • 2. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Code Example 1: Execution Time ~ 1.2s (() => { let han = {firstname: "Han", lastname: "Solo"}; let luke = {firstname: "Luke", lastname: "Skywalker"}; let leia = {firstname: "Leia", lastname: "Organa"}; let obi = {firstname: "Obi", lastname: "Wan"}; let persons = [ han, luke, leia, obi, han, luke, leia, obi]; let getName = (person) => person.lastname; console.time("engine"); for(var i = 0; i < 1000 * 1000 * 1000; i++) { getName(persons[i & 7]); } console.timeEnd("engine"); })();
  • 3. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Code Example 2: Execution Time ~ 1.8s (() => { let han = {firstname: "Han", lastname: "Solo", spaceship: "Falcon"}; let luke = {firstname: "Luke", lastname: "Skywalker"}; let leia = {firstname: "Leia", lastname: "Organa"}; let obi = {firstname: "Obi", lastname: "Wan"}; let persons = [ han, luke, leia, obi, han, luke, leia, obi]; let getName = (person) => person.lastname; console.time("engine"); for(var i = 0; i < 1000 * 1000 * 1000; i++) { getName(persons[i & 7]); } console.timeEnd("engine"); })();
  • 4. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Code Example 3: Execution Time ~ 8.4s (() => { let han = {firstname: "Han", lastname: "Solo", spacecraft: "Falcon"}; let luke = {firstname: "Luke", lastname: "Skywalker", job: "Jedi"}; let leia = {firstname: "Leia", lastname: "Organa", gender: "female"}; let obi = {firstname: "Obi", lastname: "Wan", retired: true}; let yoda = {lastname: "Yoda"}; let persons = [ han, luke, leia, obi, yoda, luke, leia, obi]; let getName = (person) => person.lastname; console.time("engine"); for(var i = 0; i < 1000 * 1000 * 1000; i++) { getName(persons[i & 7]); } console.timeEnd("engine"); })();
  • 5. Rainer Hahnekamp @ ViennaJS, 31. January 2017 What is a JavaScript Engine ● Executes JavaScript Source Code ● Bundled in the browser, but can be run separately ● It is not the Rendering Engine ● Until V8 only interpreted
  • 6. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Design of Modern Engines
  • 7. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Design of Modern Engines let getName = (person) => person.lastname; let han = {firstname: "Han", lastname: "Solo"}; let luke = {firstname: "Luke", lastname: "Skywalker"}; let leia = {firstname: "Leia", lastname: "Organa"}; let obi = {firstname: "Obi", lastname: "Wan"}; let persons = [han, luke, leia, obi]; for(var i = 0; i < 1000 * 1000 * 1000; i++) { getName(persons[i & 3]); } Source Code JavaScript Engine Interpreter Compiler (JIT) Machine CodeOptimisation Step Optimisation Step Optimisation Step
  • 8. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Integrating Static Types during Runtime Inline Caching http://www.taproot.com/archives/60650
  • 9. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Execution as Interpreter (Pre V8 Time) function getName(person) han firstname lastname luke firstname lastname leia firstname lastname obi firstname lastname lastname 1. search for memory location of property lastname 2. return value of lastname
  • 10. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Interpreter with Hidden Classes function getName(person) han firstname lastname luke firstname lastname leia firstname lastname obi firstname lastname lastname 1. search for memory location of property lastname 2. return value of lastname Recording all hidden classes passed to that function. Hidden Class: p1 firstname lastname
  • 11. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Compilation Phase function getName(person) 1. search for memory location of property lastname 2. return value of lastname only hidden class p1 is passed Just-in-Time Compiler function getName(person: p1) 1. return known location of lastname from p1 Machine Code
  • 12. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Optimised & Compiled Code with Monomorphic Inline Cache function getName(person: p1) han firstname lastname luke firstname lastname leia firstname lastname obi firstname lastname lastname 1. return known location of lastname from p1 Hidden Class: p1 firstname lastname Machine Code
  • 13. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Optimised & Compiled Code with Polymorphic Inline Cache function getName(person: p1 | p2) han firstname lastname luke firstname lastname leia firstname lastname obi firstname lastname lastname 1. if person is p1, return known from p1 2. if person is p2, return known location from p2 Hidden Class: p1 firstname lastname Machine Code spaceship Hidden Class: p2 spaceship
  • 14. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Inline Caching ● Monomorphic ○ Hidden Classes: 1 ○ Duration: 1.2s ● Polymorphic ○ Hidden Classes: 2 - 4 ○ Duration: 1.8s - 2.4s ● Megamorphic ○ Hidden Classes: > 4 ○ Duration: 8.4s
  • 15. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Code Example 4: Execution Time ~ 1.2s (() => { class Person { constructor(firstname, lastname, spaceship, job, gender, retired) { this.firstname = firstname; this.lastname = lastname; this.spaceship = spaceship; this.job = job; this.gender = gender; this.retired = retired; } } let han = new Person("Han", "Solo", "Falcon"); let luke = new Person("Luke", "Skywalker", null, "Jedi"); let leia = new Person("Leia", "Organa", null, null, "female"); let obi = new Person("Obi", "Wan", null, null, null, true); let yoda = new Person(null, "Yoda"); let persons = [han, luke, leia, obi, yoda, luke, leia, obi]; let getName = (person) => person.lastname; console.time("engine"); for(var i = 0; i < 1000 * 1000 * 1000; i++) { getName(persons[i & 7]); } console.timeEnd("engine"); })();
  • 16. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Final Advice ● Use Classes instead of object literals ● Use a Transpiler with support for Static Types (TypeScript,...) ● Don’t outsmart the Engine
  • 17. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Further Reading 1/2 ● David Mark Clements: Performance Killers for TurboShift and Ignition: https://github.com/davidmarkclements/v8-perf ● Victor Felder: JavaScript Engines Hidden Classes https://draft.li/blog/2016/12/22/javascript-engines-hidden-classes ● Jörg W. Mittag: Overview of JIT Compiler and Interpreter https://softwareengineering.stackexchange.com/questions/246094/understanding- the-differences-traditional-interpreter-jit-compiler-jit-interp/269878#269878 ● Vyacheslav Egorov: What’s up with Monomorphism http://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html
  • 18. Rainer Hahnekamp @ ViennaJS, 31. January 2017 Further Reading 2/2 ● WebComic explaining Google Chrome https://www.google.com/googlebooks/chrome/big_00.html ● Huiren Woo: Differences between V8 and ChakraCore https://developers.redhat.com/blog/2016/05/31/javascript-engine-performance-comparison- v8-charkra-chakra-core-2/ ● Seth Thompson: V8, Advanced JavaScript, & the Next Performance Frontier https://www.youtube.com/watch?v=EdFDJANJJLs ● Franziska Hinkelmann - Performance Profiling for V8 https://www.youtube.com/watch?v=j6LfSlg8Fig ● Benedikt Meurer: An Introduction to Speculative Optimization in V8 https://ponyfoo.com/articles/an-introduction-to-speculative-optimization-in-v8