SlideShare a Scribd company logo
High Performance JavaScript
Nicholas C. Zakas
Yahoo!, Inc.




                    October 9, 2010
Who's this guy?




         Principal Front End      Contributor,
              Engineer         Creator of YUI Test




Author         Lead Author     Contributor           Lead Author
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010
@slicknet



(Complaints: @codepo8)
Does JavaScript performance
         matter?
After all, all browsers now have
     optimizing JavaScript engines




Tracemonkey/    V8     Squirrelfish   Chakra   Karakan
JaegarMonkey   (all)      (4+)         (9+)    (10.5+)
    (3.5+)
So our scripts are getting really,
           really fast
Old computers ran slow applications
     Small amounts of CPU power and memory
New computers are generally faster but
       slow applications still exist
More CPU + more memory = less disciplined application development
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010
It's still possible to write slow
JavaScript on the new, faster
       JavaScript engines
JavaScript performance
        directly
affects user experience
High Performance JavaScript - Fronteers 2010
Where to start?
The UI Thread
The brains of the operation
The browser UI thread is responsible for
both UI updates and JavaScript execution
           Only one can happen at a time
Jobs for UI updates and JavaScript execution are
  added to a UI queue if the UI thread is busy
         Each job must wait in line for its turn to execute
<button id="btn" style="font-size: 30px; padding: 0.5em
    1em">Click Me</button>

<script type="text/javascript">
window.onload = function(){
   document.getElementById("btn").onclick = function(){
       //do something
   };
};
</script>




                                                 Demo!
Before Click

UI Thread



time
                           UI Queue
When Clicked

UI Thread



time
                           UI Queue

                             UI Update

                             onclick

                             UI Update
When Clicked

UI Thread

 UI Update

time
                                   UI Queue

                                     onclick
        Draw down state
                                     UI Update
When Clicked

UI Thread

 UI Update   onclick

time
                              UI Queue

                                UI Update
When Clicked

UI Thread

 UI Update   onclick       UI Update

time
                                       UI Queue


               Draw up state
No UI updates while JavaScript is
           executing




                             Demo!
JavaScript May Cause UI Update
<button id="btn" style="font-size: 30px; padding: 0.5em
    1em">Click Me</button>

<script type="text/javascript">
window.onload = function(){
   document.getElementById("btn").onclick = function(){
       var div = document.createElement(“div”);
       div.className = “tip”;
       div.innerHTML = “You clicked me!”;
       document.body.appendChild(div);
   };
};
</script>
A UI update must use the latest
        info available
Long-running JavaScript
          =
   Unresponsive UI
Responsive UI

UI Thread

 UI Update   JavaScript   UI Update

time
Unresponsive UI

UI Thread

 UI Update       JavaScript    UI Update

time
The longer JavaScript runs,
the worse the user experience
The runaway script timer prevents JavaScript
         from running for too long
      Each browser imposes its own limit (except Opera)
Internet Explorer
Firefox
Safari
Chrome
http://www.flickr.com/photos/wordridden/426920261/
Runaway Script Timer Limits
• Internet Explorer: 5 million statements
• Firefox: 10 seconds
• Safari: 5 seconds
• Chrome: Unknown, hooks into normal crash
  control mechanism
• Opera: none
Does JIT compiling help?
Interpreted JavaScript

UI Thread

                Interpret

time
JITed JavaScript (1st Run)

UI Thread

Compile     Execute

time
JITed JavaScript (After 1st Run)

UI Thread

   Execute

time
How Long Is Too Long?
“0.1 second [100ms] is about the limit for
having the user feel that the system is reacting
instantaneously, meaning that no special
feedback is necessary except to display the
result.”
                                  - Jakob Nielsen




                                           Demo!
Translation:
 No single JavaScript job should
execute for more than 100ms to
     ensure a responsive UI
Recommendation:
Limit JavaScript execution to no more
              than 50ms




        measured on IE6 :)
Doing so makes your program
          awesome
Loadtime Techniques
Don't let JavaScript interfere with page load performance
During page load, JavaScript
takes more time on the UI thread
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <script src="foo.js"></script>
    <p>See ya!</p>
</body>
</html>
Result

UI Thread

 UI Update   JavaScript   UI Update

time
Result

UI Thread

 Hello world!   foo.js   See ya!

time




                             Demo!
Result

UI Thread

 Hello world!   Download   Parse   Run   See ya!

time




  The UI thread needs to wait for the script to
  download, parse, and run before continuing
Result

UI Thread

 Hello world!   Download    Parse   Run   See ya!



                 Variable      Constant




Download time takes the longest and is variable
Translation:
   The page doesn't render while
JavaScript is downloading, parsing, or
     executing during page load
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <script src="foo.js"></script>
    <p>Hello world!</p>
    <script src="bar.js"></script>
    <p>See ya!</p>
    <script src="baz.js"></script>
    <p>Uh oh!</p>
</body>
</html>
Result

UI Thread

 JavaScript   UI Update   JavaScript   UI Update   JavaScript


time




  The more scripts to download in between UI
  updates, the longer the page takes to render
Technique #1: Put scripts at the
           bottom
High Performance JavaScript - Fronteers 2010
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <p>See ya!</p>
    <script src="foo.js"></script>
</body>
</html>
Put Scripts at Bottom

UI Thread

 UI Update   UI Update   JavaScript   JavaScript   JavaScript


time



                                                                Demo!


   Even if there are multiple scripts, the page
                 renders quickly
Technique #2: Combine
    JavaScript files
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <p>See ya!</p>
    <script src="foo.js"></script>
    <script src="bar.js"></script>
    <script src="baz.js"></script>
</body>
</html>
UI Thread

UI Update   JavaScript   JavaScript   JavaScript


time




       Each script has overhead of downloading
UI Thread

UI Update   JavaScript


time




 Combining all of the files limits the network
overhead and gets scripts onto the page faster
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <p>See ya!</p>
    <script src="foo-and-bar-and-baz.js"></script>
</body>
</html>
Technique #3: Load scripts
       dynamically
Basic Technique
var script = document.createElement("script"),
   body;
script.type = "text/javascript";
script.src = "foo.js";
body.appendChild(script, body.firstChild);




Dynamically loaded scripts are non-blocking
Downloads no longer block the
         UI thread
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <script src="foo.js"></script>
    <p>See ya!</p>
</body>
</html>
Using HTML <script>

UI Thread

 Hello world!      Download   Parse   Run   See ya!

time
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <script>
    var script = document.createElement("script"),
          body = document.body;
    script.type = "text/javascript";
    script.src = "foo.js";
    body.insertBefore(script, body.firstChild);
    </script>
    <p>See ya!</p><!-- more content -->
</body>
</html>
Using Dynamic Scripts

UI Thread

 Hello world!   See ya!            Run   UI Update

time


                Download   Parse




Only code execution happens on the UI thread,
   which means less blocking of UI updates
function loadScript(url, callback){

    var script = document.createElement("script"),
        body = document.body;
    script.type = "text/javascript";

    if (script.readyState){ //IE <= 8
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" ||
                    script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else { //Others
        script.onload = function(){
            callback();
        };
    }

    script.src = url;
    body.insertBefore(script, body.firstChild);

}
Usage


loadScript("foo.js", function(){
      alert("Loaded!");
});
Timing Note:
 Script execution begins immediately
after download and parse – timing of
     execution is not guaranteed
Using Dynamic Scripts

UI Thread

 Hello world!                      Run   See ya!   UI Update

time


                Download   Parse




Depending on time to download and script size,
 execution may happen before next UI update
Technique #4: Defer scripts
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <script defer src="foo.js"></script>
    <p>See ya!</p>
    <!-- even more markup -->
</body>
</html>
Support for <script defer>




3.5 Soon Soon 4.0              ?
Deferred scripts begin to
  download immediately,
but don't execute until all UI
     updates complete
   (DOMContentLoaded)
Using <script defer>

UI Thread

 Hello world!     See ya!     More UI   More UI   Run




time


                   Download     Parse




   Similar to dynamic script nodes, but with a
    guarantee that execution will happen last
Timing Note:
Although scripts always execute after
  UI updates complete, the order of
multiple <script defer> scripts is not
     guaranteed across browsers
Technique #5: Asynchronous
          scripts
<!doctype html>
<html>
<head>
    <title>Example</title>
</head>
<body>
    <p>Hello world!</p>
    <script async src="foo.js"></script>
    <p>See ya!</p>
    <!-- even more markup -->
</body>
</html>
Support for <script async>




3.6 Soon Soon ?                ?
Asynchronous scripts behave a
   lot like dynamic scripts
Using <script async>

UI Thread

 Hello world!      See ya!            Run   UI Update

time


                   Download   Parse




Download begins immediately and execution is
       slotted in at first available spot
Note:
Order of execution is explicitly not
preserved for asynchronous scripts
Runtime Techniques
Ways to ensure JavaScript doesn't run away
function processArray(items, process, callback){
    for (var i=0,len=items.length; i < len; i++){
        process(items[i]);
    }
    callback();
}
Technique #1: Timers
JavaScript Timers
• Created using setTimeout()
• Schedules a new JavaScript execution job for
  some time in the future
• When the delay is up, the job is added to the
  UI queue
   – Note: This does not guarantee execution
     after the delay, just that the job is added
     to the UI queue and will be executed when
     appropriate
JavaScript Timers
• For complex processing, split up into timed
  functionality
• Use timers to delay some processing for later
function timedProcessArray(items, process, callback){
    //create a clone of the original
     var todo = items.concat();
    setTimeout(function(){
        var start = +new Date();
        do {
              process(todo.shift());
        } while (todo.length > 0 &&
               (+new Date() - start < 50));
        if (todo.length > 0){
              setTimeout(arguments.callee, 25);
        } else {
              callback(items);
        }
    }, 25);
}                                                 Demo(s)!
When Clicked

UI Thread



time
                           UI Queue

                             UI Update

                             onclick

                             UI Update
When Clicked

UI Thread

 UI Update

time
                            UI Queue

                              onclick

                              UI Update
When Clicked

UI Thread

 UI Update   onclick




time
                                  UI Queue

                                    UI Update
When Clicked

UI Thread

 UI Update   onclick   UI Update

time
                                   UI Queue
After 25ms

UI Thread

 UI Update   onclick   UI Update

time
                                    UI Queue

                                      JavaScript
After 25ms

UI Thread

 UI Update   onclick   UI Update   JavaScript




time
                                                UI Queue
After Another 25ms

UI Thread

 UI Update   onclick   UI Update   JavaScript




time
                                                UI Queue

                                                  JavaScript
After Another 25ms

UI Thread

 UI Update   onclick   UI Update   JavaScript         JavaScript




time
                                                UI Queue
Technique #2: Web Workers
High Performance JavaScript - Fronteers 2010
Web Workers
• Asynchronous JavaScript execution
• Execution happens in a separate process
   – Not on the UI thread = no UI delays
• Data-driven API
   – Data is serialized when sending data into
     or out of Worker
   – No access to DOM, BOM
   – Completely separate execution
     environment
//in page
var worker = new Worker("process.js");
worker.onmessage = function(event){
     useData(event.data);
};
worker.postMessage(values);



//in process.js
self.onmessage = function(event){
     var items = event.data;
     for (var i=0,len=items.length; i < len; i++){
         process(items[i]);
     }
     self.postMessage(items);
};
                                                     Demo!
When Clicked

UI Thread



time
                           UI Queue

                             UI Update

                             onclick

                             UI Update
When Clicked

UI Thread

 UI Update

time
                            UI Queue

                              onclick

                              UI Update
When Clicked

UI Thread

 UI Update   onclick




time
                                  UI Queue

                                    UI Update
When Clicked

UI Thread

 UI Update   onclick




time

             Worker Thread        UI Queue

                                    UI Update
When Clicked

UI Thread

 UI Update   onclick       UI Update

time

             Worker Thread             UI Queue

                       JavaScript
Worker Thread Complete

UI Thread

 UI Update    onclick   UI Update

time
                                    UI Queue

                                     onmessage
Worker Thread Complete

UI Thread

 UI Update    onclick   UI Update   onmessage




time
                                           UI Queue
Support for Web Workers




3.5 4.0    4.0      ?   10.6
Recap
High Performance JavaScript - Fronteers 2010
The browser UI thread is responsible for
both UI updates and JavaScript execution
           Only one can happen at a time
Responsive UI

UI Thread

 UI Update   JavaScript   UI Update

time
Unresponsive UI

UI Thread

 UI Update       JavaScript    UI Update

time
Avoid Slow Loading JavaScript
• Put scripts at the bottom
• Concatenate scripts into as few files as
  possible
• Choose the right way to load your scripts
   – Dynamically created scripts
   – Deferred scripts
   – Asynchronous scripts
Avoid Slow JavaScript
• Don't allow JavaScript to execute for more
  than 50ms
• Break up long JavaScript processes using:
   – Timers
   – Web Workers
The End
Etcetera
• My blog:
  www.nczonline.net

• Twitter:
  @slicknet

• These Slides:
  http://slideshare.net/nzakas/presentations/

• Rate Me:
  http://spkr8.com/t/4568
Questions?
Creative Commons Images Used
•   http://www.flickr.com/photos/8628950@N06/1332225362/
•   http://www.flickr.com/photos/hippie/2406411610/
•   http://www.flickr.com/photos/55733754@N00/3325000738/
•   http://www.flickr.com/photos/eurleif/255241547/
•   http://www.flickr.com/photos/off_the_wall/3444915939/
•   http://www.flickr.com/photos/wwarby/3296379139/
•   http://www.flickr.com/photos/derekgavey/4358797365/
•   http://www.flickr.com/photos/mulad/286641998/

More Related Content

PDF
Performance on the Yahoo! Homepage
PDF
Nicholas' Performance Talk at Google
PPTX
JavaScript Timers, Power Consumption, and Performance
PDF
High Performance JavaScript (YUIConf 2010)
PPT
Responsive interfaces
PDF
YUI Test The Next Generation (YUIConf 2010)
PDF
High Performance JavaScript - WebDirections USA 2010
PPTX
Enough with the JavaScript already!
Performance on the Yahoo! Homepage
Nicholas' Performance Talk at Google
JavaScript Timers, Power Consumption, and Performance
High Performance JavaScript (YUIConf 2010)
Responsive interfaces
YUI Test The Next Generation (YUIConf 2010)
High Performance JavaScript - WebDirections USA 2010
Enough with the JavaScript already!

What's hot (20)

PDF
High Performance JavaScript (Amazon DevCon 2011)
PDF
High Performance JavaScript - jQuery Conference SF Bay Area 2010
PDF
Progressive Enhancement 2.0 (Conference Agnostic)
PDF
jQuery 1.9 and 2.0 - Present and Future
PDF
High Performance JavaScript 2011
PPTX
High Performance Snippets
PPTX
High Performance JavaScript (CapitolJS 2011)
PPTX
Browser Wars Episode 1: The Phantom Menace
PDF
Testing Mobile JavaScript
PDF
Hyperlight Websites - Chris Zacharias
PDF
Mobile Web Speed Bumps
PPTX
Cache is King
PDF
Learning from the Best jQuery Plugins
PDF
Web versus Native: round 1!
PDF
Empowering the "mobile web"
PDF
Building performance into the new yahoo homepage presentation
PDF
APIs, now and in the future
PDF
How to Build Real-time Chat App with Express, ReactJS, and Socket.IO?
PDF
Node JS Express: Steps to Create Restful Web App
PDF
APIs for modern web apps
High Performance JavaScript (Amazon DevCon 2011)
High Performance JavaScript - jQuery Conference SF Bay Area 2010
Progressive Enhancement 2.0 (Conference Agnostic)
jQuery 1.9 and 2.0 - Present and Future
High Performance JavaScript 2011
High Performance Snippets
High Performance JavaScript (CapitolJS 2011)
Browser Wars Episode 1: The Phantom Menace
Testing Mobile JavaScript
Hyperlight Websites - Chris Zacharias
Mobile Web Speed Bumps
Cache is King
Learning from the Best jQuery Plugins
Web versus Native: round 1!
Empowering the "mobile web"
Building performance into the new yahoo homepage presentation
APIs, now and in the future
How to Build Real-time Chat App with Express, ReactJS, and Socket.IO?
Node JS Express: Steps to Create Restful Web App
APIs for modern web apps
Ad

Viewers also liked (6)

PDF
Enterprise JavaScript Error Handling (Ajax Experience 2008)
PDF
Maintainable JavaScript 2011
PDF
Extreme JavaScript Compression With YUI Compressor
PPTX
JavaScript APIs you’ve never heard of (and some you have)
PPTX
Maintainable JavaScript 2012
PDF
Writing Efficient JavaScript
Enterprise JavaScript Error Handling (Ajax Experience 2008)
Maintainable JavaScript 2011
Extreme JavaScript Compression With YUI Compressor
JavaScript APIs you’ve never heard of (and some you have)
Maintainable JavaScript 2012
Writing Efficient JavaScript
Ad

Similar to High Performance JavaScript - Fronteers 2010 (20)

PDF
Js Saturday 2013 your jQuery could perform better
PDF
Performance Optimization and JavaScript Best Practices
PDF
Developing High Performance Web Apps
KEY
Developing High Performance Web Apps - CodeMash 2011
PDF
Performance patterns
PPTX
JavaScript performance patterns
PPTX
JavaScript Performance Patterns
PDF
Front-end optimisation & jQuery Internals (Pycon)
PPTX
JavaScript front end performance optimizations
PDF
PrairieDevCon 2014 - Web Doesn't Mean Slow
PDF
Ajax Performance Tuning and Best Practices
PPT
Web performance essentials - Goodies
PPTX
Unlearning and Relearning jQuery - Client-side Performance Optimization
ODP
Web program-peformance-optimization
PPT
Oscon 20080724
PDF
All you need to know about JavaScript loading and execution in the browser - ...
PDF
Front-end optimisation & jQuery Internals
PPT
Sanjeev ghai 12
PDF
Deep dive into browser internal processing
PDF
High Performance JavaScript Build Faster Web Application Interfaces 1st Editi...
Js Saturday 2013 your jQuery could perform better
Performance Optimization and JavaScript Best Practices
Developing High Performance Web Apps
Developing High Performance Web Apps - CodeMash 2011
Performance patterns
JavaScript performance patterns
JavaScript Performance Patterns
Front-end optimisation & jQuery Internals (Pycon)
JavaScript front end performance optimizations
PrairieDevCon 2014 - Web Doesn't Mean Slow
Ajax Performance Tuning and Best Practices
Web performance essentials - Goodies
Unlearning and Relearning jQuery - Client-side Performance Optimization
Web program-peformance-optimization
Oscon 20080724
All you need to know about JavaScript loading and execution in the browser - ...
Front-end optimisation & jQuery Internals
Sanjeev ghai 12
Deep dive into browser internal processing
High Performance JavaScript Build Faster Web Application Interfaces 1st Editi...

More from Nicholas Zakas (9)

PPTX
The Pointerless Web
PPTX
Scalable JavaScript Application Architecture 2012
PDF
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
PDF
Scalable JavaScript Application Architecture
PDF
Speed Up Your JavaScript
PDF
Maintainable JavaScript
PDF
JavaScript Variable Performance
ODP
The New Yahoo! Homepage and YUI 3
PDF
Test Driven Development With YUI Test (Ajax Experience 2008)
The Pointerless Web
Scalable JavaScript Application Architecture 2012
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Scalable JavaScript Application Architecture
Speed Up Your JavaScript
Maintainable JavaScript
JavaScript Variable Performance
The New Yahoo! Homepage and YUI 3
Test Driven Development With YUI Test (Ajax Experience 2008)

Recently uploaded (20)

PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
SAP855240_ALP - Defining the Global Template PUBLIC.pdf
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Reimagining Insurance: Connected Data for Confident Decisions.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
DevOps & Developer Experience Summer BBQ
PDF
CIFDAQ's Teaching Thursday: Moving Averages Made Simple
PDF
KodekX | Application Modernization Development
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Omni-Path Integration Expertise Offered by Nor-Tech
PDF
Event Presentation Google Cloud Next Extended 2025
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
PDF
cuic standard and advanced reporting.pdf
PDF
Sensors and Actuators in IoT Systems using pdf
PDF
Smarter Business Operations Powered by IoT Remote Monitoring
PDF
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Newfamily of error-correcting codes based on genetic algorithms
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Review of recent advances in non-invasive hemoglobin estimation
Understanding_Digital_Forensics_Presentation.pptx
SAP855240_ALP - Defining the Global Template PUBLIC.pdf
MYSQL Presentation for SQL database connectivity
Reimagining Insurance: Connected Data for Confident Decisions.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
DevOps & Developer Experience Summer BBQ
CIFDAQ's Teaching Thursday: Moving Averages Made Simple
KodekX | Application Modernization Development
NewMind AI Weekly Chronicles - August'25 Week I
Omni-Path Integration Expertise Offered by Nor-Tech
Event Presentation Google Cloud Next Extended 2025
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
cuic standard and advanced reporting.pdf
Sensors and Actuators in IoT Systems using pdf
Smarter Business Operations Powered by IoT Remote Monitoring
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
NewMind AI Monthly Chronicles - July 2025
Newfamily of error-correcting codes based on genetic algorithms
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Review of recent advances in non-invasive hemoglobin estimation

High Performance JavaScript - Fronteers 2010