SlideShare a Scribd company logo
1 of 125
High Performance JavaScript Nicholas C. Zakas| CapitolJS | September 18, 2011
Who's this guy? Co-Creator csslint.net Contributor, Creator of YUI Test Ex-tech lead Yahoo! Author Lead Author Contributor Lead Author
@slicknet (complaints: @voodootikigod)
Does JavaScript performance matter?
All browsers now haveoptimizing JavaScript engines Tracemonkey/ JaegarMonkey (3.5+) V8 (all) Nitro (4+) Chakra (9+) Karakan (10.5+)
http://ie.microsoft.com/testdrive/benchmarks/sunspider/default.html
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
Oh yeah, one more thing
It's still possible to write slow JavaScript
JavaScript performancedirectlyaffects user experience
The UI Threadaka Browser Event Loop
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 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>
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 onclick UI Update time UI Queue UI Update
When Clicked UI Thread onclick UI Update UI Update time UI Queue Draw up state
No UI updates while JavaScript is executing
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 JavaScript UI Update UI Update time
Unresponsive UI UI Thread JavaScript UI Update 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
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
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
Translation:No single JavaScript job should execute for more than 100ms to ensure a responsive UI
Recommendation:Limit JavaScript execution to no more than 50msmeasured on IE6 :)
Loadtime TechniquesDon'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 JavaScript UI Update UI Update time
Result UI Thread foo.js See ya! Hello world! time
Result UI Thread Download See ya! Hello world! Parse Run time The UI thread needs to wait for the script to download, parse, and run before continuing
Result UI Thread Download See ya! Hello world! Parse Run 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 UI Update JavaScript JavaScript time The more scripts to download in between UI updates, the longer the page takes to render
Technique #1: Load scripts dynamically
Basic Technique var script = document.createElement("script"),     body; script.type = "text/javascript"; script.src = "foo.js"; body.insertBefore(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 Download See ya! Hello world! Parse Run 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 See ya! Hello world! UI Update Run 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
Technique #2: 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> ? 5.0 3.5 7.0 4.0
Deferred scripts begin to download immediately, but don't execute until all UI updates complete
Using <script defer> UI Thread See ya! Hello world! More UI Run More UI 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 #3: 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> ? 5.0 3.6 7.0 10
Asynchronous scripts behave a lot like dynamic scripts
Using <script async> UI Thread See ya! Hello world! UI Update Run 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 TechniquesWays 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
//create a new timer and delay by 500ms setTimeout(function(){ //code to execute here }, 500); setTimeout() schedules a function to be added to the UI queue after a delay
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); }
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 onclick UI Update time UI Queue UI Update
When Clicked UI Thread UI Update UI Update onclick time UI Queue
After 25ms UI Thread UI Update UI Update onclick time UI Queue JavaScript
After 25ms UI Thread JavaScript UI Update UI Update onclick time UI Queue
After Another 25ms UI Thread JavaScript UI Update UI Update onclick time UI Queue JavaScript
After Another 25ms UI Thread JavaScript JavaScript UI Update UI Update onclick time UI Queue
Technique #2: Script Yielding NEW!
//delay a function until after UI updates are done setImmediate(function(){ //code to execute here }); setImmediate() adds code to the UI queue after pending UI updates are finished
Support for Script Yielding ? ? ? ? 10 msSetIntermediate()
functionyieldingProcessArray(items, process, callback){ //create a clone of the originalvartodo = items.concat(); setImmediate(function(){ var start = +new Date(); do {             process(todo.shift());         } while (todo.length > 0 &&              (+new Date() - start < 50)); if (todo.length > 0){ setImmediate(arguments.callee);         } else {             callback(items);         } }); }
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 onclick UI Update time UI Queue UI Update
When Clicked UI Thread UI Update UI Update onclick time UI Queue
After Last UI Update UI Thread UI Update UI Update onclick time UI Queue JavaScript
After Last UI Update UI Thread JavaScript UI Update UI Update onclick time UI Queue
No Other UI Updates UI Thread JavaScript UI Update UI Update onclick time UI Queue JavaScript
No Other UI Updates UI Thread JavaScript JavaScript UI Update UI Update onclick time UI Queue
Technique #3: Web Workers
Support for Web Workers 10.6 4.0 3.5 4.0 10
Web Workers Asynchronous JavaScript execution Execution happens outside the UI thread Doesn’t block UI updates Data-Driven API Data is serialized going into and out of the worker No access to DOM or BOM 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); };
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 onclick UI Update time UI Queue UI Update
When Clicked UI Thread onclick UI Update time UI Queue Worker Thread UI Update
When Clicked UI Thread UI Update UI Update onclick time UI Queue Worker Thread JavaScript
Worker Thread Complete UI Thread UI Update UI Update onclick time UI Queue onmessage
Worker Thread Complete UI Thread onmessage UI Update UI Update onclick time UI Queue
Recap
The browser UI thread is responsible for both UI updates and JavaScript execution Only one can happen at a time
Responsive UI UI Thread JavaScript UI Update UI Update time
Unresponsive UI UI Thread JavaScript UI Update UI Update time
Avoid Slow Loading JavaScript 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 Script Yielding (future) Web Workers
Etcetera My blog: 	www.nczonline.net Twitter:		@slicknet These Slides:	slideshare.net/nzakas Hire us:		projects@stubbornella.org
Questions?
Creative Commons Images Used http://www.flickr.com/photos/lrargerich/3115367361/ 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/ http://www.flickr.com/photos/torley/2361164281/ http://www.flickr.com/photos/ottoman42/455242/ http://www.flickr.com/photos/goincase/3843348908/

More Related Content

What's hot

High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011Nicholas Zakas
 
Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Nicholas Zakas
 
Mobile Web Speed Bumps
Mobile Web Speed BumpsMobile Web Speed Bumps
Mobile Web Speed BumpsNicholas Zakas
 
Browser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom MenaceBrowser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom MenaceNicholas Zakas
 
High Performance Snippets
High Performance SnippetsHigh Performance Snippets
High Performance SnippetsSteve Souders
 
Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsStoyan Stefanov
 
Building an HTML5 Video Player
Building an HTML5 Video PlayerBuilding an HTML5 Video Player
Building an HTML5 Video PlayerJim Jeffers
 
Testing Mobile JavaScript
Testing Mobile JavaScriptTesting Mobile JavaScript
Testing Mobile JavaScriptjeresig
 
JavaScript Libraries: The Big Picture
JavaScript Libraries: The Big PictureJavaScript Libraries: The Big Picture
JavaScript Libraries: The Big PictureSimon Willison
 
High Performance Ajax Applications
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax ApplicationsJulien Lecomte
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSPablo Godel
 
jQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksjQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksAddy Osmani
 
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...David Kaneda
 
JavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and PerformanceJavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and PerformanceNicholas Zakas
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Matt Raible
 
AngularJS for Legacy Apps
AngularJS for Legacy AppsAngularJS for Legacy Apps
AngularJS for Legacy AppsPeter Drinnan
 
High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)Nicholas Zakas
 

What's hot (20)

High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011
 
Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)
 
Mobile Web Speed Bumps
Mobile Web Speed BumpsMobile Web Speed Bumps
Mobile Web Speed Bumps
 
WordPress and Ajax
WordPress and AjaxWordPress and Ajax
WordPress and Ajax
 
Browser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom MenaceBrowser Wars Episode 1: The Phantom Menace
Browser Wars Episode 1: The Phantom Menace
 
High Performance Snippets
High Performance SnippetsHigh Performance Snippets
High Performance Snippets
 
Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web Applications
 
Building an HTML5 Video Player
Building an HTML5 Video PlayerBuilding an HTML5 Video Player
Building an HTML5 Video Player
 
Ajax Security
Ajax SecurityAjax Security
Ajax Security
 
Testing Mobile JavaScript
Testing Mobile JavaScriptTesting Mobile JavaScript
Testing Mobile JavaScript
 
JavaScript Libraries: The Big Picture
JavaScript Libraries: The Big PictureJavaScript Libraries: The Big Picture
JavaScript Libraries: The Big Picture
 
Fav
FavFav
Fav
 
High Performance Ajax Applications
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax Applications
 
Tek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJSTek 2013 - Building Web Apps from a New Angle with AngularJS
Tek 2013 - Building Web Apps from a New Angle with AngularJS
 
jQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & TricksjQuery Proven Performance Tips & Tricks
jQuery Proven Performance Tips & Tricks
 
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
 
JavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and PerformanceJavaScript Timers, Power Consumption, and Performance
JavaScript Timers, Power Consumption, and Performance
 
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
 
AngularJS for Legacy Apps
AngularJS for Legacy AppsAngularJS for Legacy Apps
AngularJS for Legacy Apps
 
High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)High Performance JavaScript (YUIConf 2010)
High Performance JavaScript (YUIConf 2010)
 

Viewers also liked

Maintainable JavaScript 2012
Maintainable JavaScript 2012Maintainable JavaScript 2012
Maintainable JavaScript 2012Nicholas Zakas
 
JavaScript APIs you’ve never heard of (and some you have)
JavaScript APIs you’ve never heard of (and some you have)JavaScript APIs you’ve never heard of (and some you have)
JavaScript APIs you’ve never heard of (and some you have)Nicholas Zakas
 
Writing Efficient JavaScript
Writing Efficient JavaScriptWriting Efficient JavaScript
Writing Efficient JavaScriptNicholas Zakas
 
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010Nicholas Zakas
 
Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)Nicholas Zakas
 
Maintainable JavaScript 2011
Maintainable JavaScript 2011Maintainable JavaScript 2011
Maintainable JavaScript 2011Nicholas Zakas
 
Enough with the JavaScript already!
Enough with the JavaScript already!Enough with the JavaScript already!
Enough with the JavaScript already!Nicholas Zakas
 
8051 Timers / Counters
8051 Timers / Counters8051 Timers / Counters
8051 Timers / CountersPatricio Lima
 
Extreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI CompressorExtreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI CompressorNicholas Zakas
 
Mt on leadership and its effects on employees performance
Mt on   leadership and its effects on employees performanceMt on   leadership and its effects on employees performance
Mt on leadership and its effects on employees performanceShashi Chandra
 
Proactive Professionalism Networking Today Nj 1
Proactive Professionalism Networking Today Nj 1Proactive Professionalism Networking Today Nj 1
Proactive Professionalism Networking Today Nj 1Suzanne Carbonaro
 
Transactional learning and simulations: how far can we go in professional leg...
Transactional learning and simulations: how far can we go in professional leg...Transactional learning and simulations: how far can we go in professional leg...
Transactional learning and simulations: how far can we go in professional leg...York University - Osgoode Hall Law School
 
Prescrition co-owners- pdf
Prescrition   co-owners- pdfPrescrition   co-owners- pdf
Prescrition co-owners- pdfsahib rox
 

Viewers also liked (20)

Maintainable JavaScript 2012
Maintainable JavaScript 2012Maintainable JavaScript 2012
Maintainable JavaScript 2012
 
JavaScript APIs you’ve never heard of (and some you have)
JavaScript APIs you’ve never heard of (and some you have)JavaScript APIs you’ve never heard of (and some you have)
JavaScript APIs you’ve never heard of (and some you have)
 
Writing Efficient JavaScript
Writing Efficient JavaScriptWriting Efficient JavaScript
Writing Efficient JavaScript
 
High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010High Performance JavaScript - Fronteers 2010
High Performance JavaScript - Fronteers 2010
 
Timers and pwm
Timers and pwmTimers and pwm
Timers and pwm
 
Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)Enterprise JavaScript Error Handling (Ajax Experience 2008)
Enterprise JavaScript Error Handling (Ajax Experience 2008)
 
Maintainable JavaScript 2011
Maintainable JavaScript 2011Maintainable JavaScript 2011
Maintainable JavaScript 2011
 
Enough with the JavaScript already!
Enough with the JavaScript already!Enough with the JavaScript already!
Enough with the JavaScript already!
 
8051 Timers / Counters
8051 Timers / Counters8051 Timers / Counters
8051 Timers / Counters
 
Extreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI CompressorExtreme JavaScript Compression With YUI Compressor
Extreme JavaScript Compression With YUI Compressor
 
Excellence land rover
Excellence land roverExcellence land rover
Excellence land rover
 
Mt on leadership and its effects on employees performance
Mt on   leadership and its effects on employees performanceMt on   leadership and its effects on employees performance
Mt on leadership and its effects on employees performance
 
Report..costing..
Report..costing..Report..costing..
Report..costing..
 
srthsrth
srthsrthsrthsrth
srthsrth
 
Ghgfhgfh
GhgfhgfhGhgfhgfh
Ghgfhgfh
 
nullcon 2011 - Buffer UnderRun Exploits
nullcon 2011 - Buffer UnderRun Exploitsnullcon 2011 - Buffer UnderRun Exploits
nullcon 2011 - Buffer UnderRun Exploits
 
Proactive Professionalism Networking Today Nj 1
Proactive Professionalism Networking Today Nj 1Proactive Professionalism Networking Today Nj 1
Proactive Professionalism Networking Today Nj 1
 
Transactional learning and simulations: how far can we go in professional leg...
Transactional learning and simulations: how far can we go in professional leg...Transactional learning and simulations: how far can we go in professional leg...
Transactional learning and simulations: how far can we go in professional leg...
 
Prescrition co-owners- pdf
Prescrition   co-owners- pdfPrescrition   co-owners- pdf
Prescrition co-owners- pdf
 
Good prescribing
Good prescribingGood prescribing
Good prescribing
 

Similar to High Performance JavaScript (CapitolJS 2011)

Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09Steve Souders
 
jQuery and_drupal
jQuery and_drupaljQuery and_drupal
jQuery and_drupalBlackCatWeb
 
Ta Javaserverside Eran Toch
Ta Javaserverside Eran TochTa Javaserverside Eran Toch
Ta Javaserverside Eran TochAdil Jafri
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance PatternsStoyan Stefanov
 
J Query Presentation
J Query PresentationJ Query Presentation
J Query PresentationVishal Kumar
 
Basic testing with selenium
Basic testing with seleniumBasic testing with selenium
Basic testing with seleniumSøren Lund
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHPKing Foo
 
Rapid JCR Applications Development with Sling
Rapid JCR Applications Development with SlingRapid JCR Applications Development with Sling
Rapid JCR Applications Development with SlingFelix Meschberger
 
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersAccelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersTodd Anglin
 
SXSW: Even Faster Web Sites
SXSW: Even Faster Web SitesSXSW: Even Faster Web Sites
SXSW: Even Faster Web SitesSteve Souders
 
Google在Web前端方面的经验
Google在Web前端方面的经验Google在Web前端方面的经验
Google在Web前端方面的经验yiditushe
 
Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011Timothy Fisher
 
Node js presentation
Node js presentationNode js presentation
Node js presentationmartincabrera
 
Wookie Meetup
Wookie MeetupWookie Meetup
Wookie Meetupscottw
 
Wookie Meetup
Wookie MeetupWookie Meetup
Wookie Meetupscottw
 
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
WebTest - Efficient Functional Web Testing with HtmlUnit and BeyondWebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyondmguillem
 
Performance on the Yahoo! Homepage
Performance on the Yahoo! HomepagePerformance on the Yahoo! Homepage
Performance on the Yahoo! HomepageNicholas Zakas
 

Similar to High Performance JavaScript (CapitolJS 2011) (20)

Responsive interfaces
Responsive interfacesResponsive interfaces
Responsive interfaces
 
Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09Even Faster Web Sites at jQuery Conference '09
Even Faster Web Sites at jQuery Conference '09
 
jQuery and_drupal
jQuery and_drupaljQuery and_drupal
jQuery and_drupal
 
Ta Javaserverside Eran Toch
Ta Javaserverside Eran TochTa Javaserverside Eran Toch
Ta Javaserverside Eran Toch
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
 
J Query Presentation
J Query PresentationJ Query Presentation
J Query Presentation
 
Basic testing with selenium
Basic testing with seleniumBasic testing with selenium
Basic testing with selenium
 
Implementing Comet using PHP
Implementing Comet using PHPImplementing Comet using PHP
Implementing Comet using PHP
 
Selenium
SeleniumSelenium
Selenium
 
Rapid JCR Applications Development with Sling
Rapid JCR Applications Development with SlingRapid JCR Applications Development with Sling
Rapid JCR Applications Development with Sling
 
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET DevelopersAccelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
Accelerated Adoption: HTML5 and CSS3 for ASP.NET Developers
 
Sxsw 20090314
Sxsw 20090314Sxsw 20090314
Sxsw 20090314
 
SXSW: Even Faster Web Sites
SXSW: Even Faster Web SitesSXSW: Even Faster Web Sites
SXSW: Even Faster Web Sites
 
Google在Web前端方面的经验
Google在Web前端方面的经验Google在Web前端方面的经验
Google在Web前端方面的经验
 
Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011Developing High Performance Web Apps - CodeMash 2011
Developing High Performance Web Apps - CodeMash 2011
 
Node js presentation
Node js presentationNode js presentation
Node js presentation
 
Wookie Meetup
Wookie MeetupWookie Meetup
Wookie Meetup
 
Wookie Meetup
Wookie MeetupWookie Meetup
Wookie Meetup
 
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
WebTest - Efficient Functional Web Testing with HtmlUnit and BeyondWebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
WebTest - Efficient Functional Web Testing with HtmlUnit and Beyond
 
Performance on the Yahoo! Homepage
Performance on the Yahoo! HomepagePerformance on the Yahoo! Homepage
Performance on the Yahoo! Homepage
 

More from Nicholas Zakas

Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012Nicholas Zakas
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Nicholas Zakas
 
YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)Nicholas Zakas
 
Nicholas' Performance Talk at Google
Nicholas' Performance Talk at GoogleNicholas' Performance Talk at Google
Nicholas' Performance Talk at GoogleNicholas Zakas
 
Scalable JavaScript Application Architecture
Scalable JavaScript Application ArchitectureScalable JavaScript Application Architecture
Scalable JavaScript Application ArchitectureNicholas Zakas
 
Speed Up Your JavaScript
Speed Up Your JavaScriptSpeed Up Your JavaScript
Speed Up Your JavaScriptNicholas Zakas
 
Maintainable JavaScript
Maintainable JavaScriptMaintainable JavaScript
Maintainable JavaScriptNicholas Zakas
 
JavaScript Variable Performance
JavaScript Variable PerformanceJavaScript Variable Performance
JavaScript Variable PerformanceNicholas Zakas
 
The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3Nicholas Zakas
 
Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)Nicholas Zakas
 

More from Nicholas Zakas (11)

The Pointerless Web
The Pointerless WebThe Pointerless Web
The Pointerless Web
 
Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012Scalable JavaScript Application Architecture 2012
Scalable JavaScript Application Architecture 2012
 
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
Progressive Enhancement 2.0 (jQuery Conference SF Bay Area 2011)
 
YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)YUI Test The Next Generation (YUIConf 2010)
YUI Test The Next Generation (YUIConf 2010)
 
Nicholas' Performance Talk at Google
Nicholas' Performance Talk at GoogleNicholas' Performance Talk at Google
Nicholas' Performance Talk at Google
 
Scalable JavaScript Application Architecture
Scalable JavaScript Application ArchitectureScalable JavaScript Application Architecture
Scalable JavaScript Application Architecture
 
Speed Up Your JavaScript
Speed Up Your JavaScriptSpeed Up Your JavaScript
Speed Up Your JavaScript
 
Maintainable JavaScript
Maintainable JavaScriptMaintainable JavaScript
Maintainable JavaScript
 
JavaScript Variable Performance
JavaScript Variable PerformanceJavaScript Variable Performance
JavaScript Variable Performance
 
The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3The New Yahoo! Homepage and YUI 3
The New Yahoo! Homepage and YUI 3
 
Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)Test Driven Development With YUI Test (Ajax Experience 2008)
Test Driven Development With YUI Test (Ajax Experience 2008)
 

Recently uploaded

What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 

High Performance JavaScript (CapitolJS 2011)

  • 1. High Performance JavaScript Nicholas C. Zakas| CapitolJS | September 18, 2011
  • 2. Who's this guy? Co-Creator csslint.net Contributor, Creator of YUI Test Ex-tech lead Yahoo! Author Lead Author Contributor Lead Author
  • 5.
  • 6.
  • 7.
  • 8. All browsers now haveoptimizing JavaScript engines Tracemonkey/ JaegarMonkey (3.5+) V8 (all) Nitro (4+) Chakra (9+) Karakan (10.5+)
  • 10. Old computers ran slow applications Small amounts of CPU power and memory
  • 11. New computers are generally faster but slow applications still exist More CPU + more memory = less disciplined application development
  • 12.
  • 13. Oh yeah, one more thing
  • 14.
  • 15.
  • 16.
  • 17. It's still possible to write slow JavaScript
  • 19. The UI Threadaka Browser Event Loop
  • 20. The browser UI thread is responsible for both UI updates and JavaScript execution Only one can happen at a time
  • 21. Jobs for UI updates and JavaScript execution are added to a UI queue Each job must wait in line for its turn to execute
  • 22. <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>
  • 23. Before Click UI Thread time UI Queue
  • 24. When Clicked UI Thread time UI Queue UI Update onclick UI Update
  • 25. When Clicked UI Thread UI Update time UI Queue onclick Draw down state UI Update
  • 26. When Clicked UI Thread onclick UI Update time UI Queue UI Update
  • 27. When Clicked UI Thread onclick UI Update UI Update time UI Queue Draw up state
  • 28. No UI updates while JavaScript is executing
  • 29. 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>
  • 30. A UI update must use the latest info available
  • 32. Responsive UI UI Thread JavaScript UI Update UI Update time
  • 33. Unresponsive UI UI Thread JavaScript UI Update UI Update time
  • 34. The longer JavaScript runs,the worse the user experience
  • 35. The runaway script timer prevents JavaScript from running for too long Each browser imposes its own limit (except Opera)
  • 40.
  • 41. 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
  • 42. 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
  • 43. Translation:No single JavaScript job should execute for more than 100ms to ensure a responsive UI
  • 44. Recommendation:Limit JavaScript execution to no more than 50msmeasured on IE6 :)
  • 45. Loadtime TechniquesDon't let JavaScript interfere with page load performance
  • 46. During page load, JavaScript takes more time on the UI thread
  • 47. <!doctype html> <html> <head> <title>Example</title> </head> <body> <p>Hello world!</p> <script src="foo.js"></script> <p>See ya!</p> </body> </html>
  • 48. Result UI Thread JavaScript UI Update UI Update time
  • 49. Result UI Thread foo.js See ya! Hello world! time
  • 50. Result UI Thread Download See ya! Hello world! Parse Run time The UI thread needs to wait for the script to download, parse, and run before continuing
  • 51. Result UI Thread Download See ya! Hello world! Parse Run Variable Constant Download time takes the longest and is variable
  • 52. Translation:The page doesn't render while JavaScript is downloading, parsing, or executing during page load
  • 53. <!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>
  • 54. Result UI Thread JavaScript UI Update UI Update JavaScript JavaScript time The more scripts to download in between UI updates, the longer the page takes to render
  • 55. Technique #1: Load scripts dynamically
  • 56. Basic Technique var script = document.createElement("script"), body; script.type = "text/javascript"; script.src = "foo.js"; body.insertBefore(script, body.firstChild); Dynamically loaded scripts are non-blocking
  • 57. Downloads no longer block the UI thread
  • 58. <!doctype html> <html> <head> <title>Example</title> </head> <body> <p>Hello world!</p> <script src="foo.js"></script> <p>See ya!</p> </body> </html>
  • 59. Using HTML <script> UI Thread Download See ya! Hello world! Parse Run time
  • 60. <!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>
  • 61. Using Dynamic Scripts UI Thread See ya! Hello world! UI Update Run time Download Parse Only code execution happens on the UI thread, which means less blocking of UI updates
  • 62. 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); }
  • 63. Usage loadScript("foo.js", function(){ alert("Loaded!"); });
  • 64. Timing Note:Script execution begins immediately after download and parse – timing of execution is not guaranteed
  • 66. <!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>
  • 67. Support for <script defer> ? 5.0 3.5 7.0 4.0
  • 68. Deferred scripts begin to download immediately, but don't execute until all UI updates complete
  • 69. Using <script defer> UI Thread See ya! Hello world! More UI Run More UI time Download Parse Similar to dynamic script nodes, but with a guarantee that execution will happen last
  • 70. Timing Note:Although scripts always execute after UI updates complete, the order of multiple <script defer> scripts is not guaranteed across browsers
  • 72. <!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>
  • 73. Support for <script async> ? 5.0 3.6 7.0 10
  • 74. Asynchronous scripts behave a lot like dynamic scripts
  • 75. Using <script async> UI Thread See ya! Hello world! UI Update Run time Download Parse Download begins immediately and execution is slotted in at first available spot
  • 76. Note:Order of execution is explicitly not preserved for asynchronous scripts
  • 77. Runtime TechniquesWays to ensure JavaScript doesn't run away
  • 78. function processArray(items, process, callback){ for (var i=0,len=items.length; i < len; i++){ process(items[i]); } callback(); }
  • 80. //create a new timer and delay by 500ms setTimeout(function(){ //code to execute here }, 500); setTimeout() schedules a function to be added to the UI queue after a delay
  • 81. 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); }
  • 82. When Clicked UI Thread time UI Queue UI Update onclick UI Update
  • 83. When Clicked UI Thread UI Update time UI Queue onclick UI Update
  • 84. When Clicked UI Thread onclick UI Update time UI Queue UI Update
  • 85. When Clicked UI Thread UI Update UI Update onclick time UI Queue
  • 86. After 25ms UI Thread UI Update UI Update onclick time UI Queue JavaScript
  • 87. After 25ms UI Thread JavaScript UI Update UI Update onclick time UI Queue
  • 88. After Another 25ms UI Thread JavaScript UI Update UI Update onclick time UI Queue JavaScript
  • 89. After Another 25ms UI Thread JavaScript JavaScript UI Update UI Update onclick time UI Queue
  • 90. Technique #2: Script Yielding NEW!
  • 91.
  • 92. //delay a function until after UI updates are done setImmediate(function(){ //code to execute here }); setImmediate() adds code to the UI queue after pending UI updates are finished
  • 93. Support for Script Yielding ? ? ? ? 10 msSetIntermediate()
  • 94. functionyieldingProcessArray(items, process, callback){ //create a clone of the originalvartodo = items.concat(); setImmediate(function(){ var start = +new Date(); do { process(todo.shift()); } while (todo.length > 0 && (+new Date() - start < 50)); if (todo.length > 0){ setImmediate(arguments.callee); } else { callback(items); } }); }
  • 95. When Clicked UI Thread time UI Queue UI Update onclick UI Update
  • 96. When Clicked UI Thread UI Update time UI Queue onclick UI Update
  • 97. When Clicked UI Thread onclick UI Update time UI Queue UI Update
  • 98. When Clicked UI Thread UI Update UI Update onclick time UI Queue
  • 99. After Last UI Update UI Thread UI Update UI Update onclick time UI Queue JavaScript
  • 100. After Last UI Update UI Thread JavaScript UI Update UI Update onclick time UI Queue
  • 101. No Other UI Updates UI Thread JavaScript UI Update UI Update onclick time UI Queue JavaScript
  • 102. No Other UI Updates UI Thread JavaScript JavaScript UI Update UI Update onclick time UI Queue
  • 103. Technique #3: Web Workers
  • 104.
  • 105. Support for Web Workers 10.6 4.0 3.5 4.0 10
  • 106. Web Workers Asynchronous JavaScript execution Execution happens outside the UI thread Doesn’t block UI updates Data-Driven API Data is serialized going into and out of the worker No access to DOM or BOM Separate execution environment
  • 107. //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); };
  • 108. When Clicked UI Thread time UI Queue UI Update onclick UI Update
  • 109. When Clicked UI Thread UI Update time UI Queue onclick UI Update
  • 110. When Clicked UI Thread onclick UI Update time UI Queue UI Update
  • 111. When Clicked UI Thread onclick UI Update time UI Queue Worker Thread UI Update
  • 112. When Clicked UI Thread UI Update UI Update onclick time UI Queue Worker Thread JavaScript
  • 113. Worker Thread Complete UI Thread UI Update UI Update onclick time UI Queue onmessage
  • 114. Worker Thread Complete UI Thread onmessage UI Update UI Update onclick time UI Queue
  • 115. Recap
  • 116. The browser UI thread is responsible for both UI updates and JavaScript execution Only one can happen at a time
  • 117. Responsive UI UI Thread JavaScript UI Update UI Update time
  • 118. Unresponsive UI UI Thread JavaScript UI Update UI Update time
  • 119. Avoid Slow Loading JavaScript Dynamically created scripts Deferred scripts Asynchronous scripts
  • 120. Avoid Slow JavaScript Don't allow JavaScript to execute for more than 50ms Break up long JavaScript processes using: Timers Script Yielding (future) Web Workers
  • 121.
  • 122.
  • 123. Etcetera My blog: www.nczonline.net Twitter: @slicknet These Slides: slideshare.net/nzakas Hire us: projects@stubbornella.org
  • 125. Creative Commons Images Used http://www.flickr.com/photos/lrargerich/3115367361/ 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/ http://www.flickr.com/photos/torley/2361164281/ http://www.flickr.com/photos/ottoman42/455242/ http://www.flickr.com/photos/goincase/3843348908/

Editor's Notes

  1. Over the past couple of years, we&apos;ve seen JavaScript development earn recognition as a true discipline. The idea that you should architect your code, use patterns and good programming practices has really elevated the role of the front end engineer. In my opinion, part of this elevation has been the adoption of what has traditionally been considered back end methodologies. We now focus on performance and algorithms, there&apos;s unit testing for JavaScript, and so much more. One of the areas that I&apos;ve seen a much slower than adoption that I&apos;d like is in the area of error handling.How many people have an error handling strategy for their backend? How many have dashboards that display problems with uptime and performance? How many have anything similar for the front end?Typically, the front end has been this black hole of information. You may get a few customer reports here and there, but you have no information about what&apos;s going on, how often it&apos;s occurring, or how many people have been affected.
  2. So what have we talked about? Maintainable JavaScript is made up of four components.First is Code Conventions that describe the format of the code you’re writing.Second is Loose Coupling – keeping HTML, JavaScript, and CSS on separate layers and keeping application logic out of event handlers.Third is Programming Practices that ensure your code is readable and easily debugged.Fourth is creating a Build Process