High Performance Kick Ass Web Apps (JavaScript edition)

Stoyan Stefanov
Stoyan Stefanovengineer at Facebook
High-Performance
Kick-Ass
Web Apps
(with focus on JavaScript)

Stoyan Stefanov, @stoyanstefanov
April 25, 2009
JSConf, Washington, D.C.
About me
•  Yahoo! Search
•  Yahoo! Exceptional
   Performance
•  YSlow 2.0 architect
•  http://smush.it
•  Books, articles
•  http://phpied.com
Importance of performance
•  500 ms slower = 20% drop in
traffic (Google)
Importance of performance
•  500 ms slower = 20% drop in
traffic (Google)
•  400 ms slower = 5-9% drop in
full-page traffic (Yahoo!)
Importance of performance
•  500 ms slower = 20% drop in
traffic (Google)
•  400 ms slower = 5-9% drop in
full-page traffic (Yahoo!)
•  100 ms slower = 1% drop in
sales (Amazon)
Importance of performance
•  Self-regulating system
•  Slow down = lose users
•  It’s about user experience
“The premature optimization…
•  … is the root of all evil”
Knuth
•  “Make it right before you
make it fast”
Crockford
Pick your battles
•  measure
•  profile
•  monitor
On trade-offs
“…everything has its drawbacks,
as the man said when his
mother-in-law died, and they
came upon him for the funeral
expenses.”

Jerome K. Jerome
Three Man in a Boat
The Life of Page 2.0
             HTML                page
   request             onload    settles     request
             sent




                                 marriage?       R.I.P.
conception birth    graduation




                     User perceived
                     “onload” happens
                     somewhere here
The waterfall
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
Less HTTP requests
•  Combine components
Less HTTP requests
•  Before:

<script src=quot;jquery.jsquot;></script> 
<script src=quot;jquery.twitter.jsquot;></script> 
<script src=quot;jquery.cookie.jsquot;></script> 
<script src=quot;myapp.jsquot;></script> 
Less HTTP requests
•  After:

<script  
    src=quot;all.jsquot;  
     type=quot;text/javascriptquot;> 
</script> 
Less HTTP requests
•  You just saved 3 HTTP requests 
Less HTTP requests
•  repeat for CSS:

<link  
      href=quot;all.cssquot;  
      rel=quot;stylesheetquot;  
      type=quot;text/css” 

/>
Less HTTP requests
•  Inline images:
   CSS sprites
   with data: URI scheme
Less HTTP requests
•  data: URI scheme

$ php ‐r quot;echo base64_encode(file_get_contents('my.png'));” 
iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAGElEQVQIW2P4
DwcMDAxAfBvMAhEQMYgcACEHG8ELxtbPAAAAAElFTkSuQmCC 
Less HTTP requests
•  data: URI scheme

background‐image: url(quot;data:image/png;base64,iVBORw0KG...quot;); 
Less HTTP requests
•  data: URI scheme

<img src=quot;data:image/png;base64,iVBOR...quot; /> 
Less HTTP requests
•  data: URI scheme
•  works in IE!...
Less HTTP requests
•  data: URI scheme
•  works in IE8!
Less HTTP requests
•  data: URI scheme
•  MHTML for IE < 8


http://www.phpied.com/mhtml-when-you-need-data-uris-in-ie7-and-under/
http://www.hedgerwow.com/360/dhtml/base64-image/demo.php
Less stuff? Cache
•  Cache is less universal than
we think
•  You can help


http://yuiblog.com/blog/2007/01/04/performance-research-part-2/
“never expire” policy
•  Static components with far-
future Expires header
•  JS, CSS, img

ExpiresActive On 
ExpiresByType image/png quot;access plus 10 yearsquot; 
Inline vs. external
•  a.k.a. less http vs. more
cache
•  how about both?
Inline vs. external
•  First visit:


1. Inline
2. Lazy-load the external file
3. Write a cookie
Inline vs. external
•  Later visits:


1. Read cookie
2. Refer to the external file
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff
3.  Out of the way
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
Gzip




       Source: Bill Scott, Netflix
Minify
•  Before
/** 
 * The dom module provides helper methods for  
 *    manipulating Dom elements. 
 * @module dom 
 * 
 */ 

(function() { 
    var Y = YAHOO.util,     // internal shorthand 
        getStyle,           // for load time browser branching 
        setStyle,           // ditto 
        propertyCache = {}, // for faster hyphen converts 
        reClassNameCache = {},          // cache regexes for className 
        document = window.document;     // cache for faster lookups 

    YAHOO.env._id_counter = YAHOO.env._id_counter || 0; 
Minify
•  After
(function(){var 
B=YAHOO.util,K,I,J={},F={},M=window.document;YAHOO.env._id_counter=YAHOO.en
v._id_counter||0; 
Minify
•  YUI Compressor
•  Minifies JS and CSS
•  Tolerates * and _ hacks
•  More than minification
Minify
•  Minify inline code too
Gzip or minification?
•  62,885 bytes - original jQuery (back in
Aug 2007)
•  31,822 - minified with the YUI
Compressor
•  19,758 - original gzipped
•  10,818 - minified and gzipped                FTW


http://www.julienlecomte.net/blog/2007/08/13/
204
•    The world’s smallest component?
•    204 No Content

<?php 
header(quot;HTTP/1.0 204 No Contentquot;); 
// .... do your job, e.g. logging 
?> 

http://www.phpied.com/204-no-content/
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff ✔
3.  Out of the way
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
Free-falling waterfalls
•  Less DNS lookups – fetch
   components from not more
   than 2-4 domains
•  Less redirects
•  Blocking JavaScript
Not free-falling
JavaScript rocks!
•  But also blocks

   html
          js
               png

               png
Non-blocking JavaScript
•    Include via DOM
     html
                  js

            png

            png


var js = document.createElement('script'); 
js.src = 'myscript.js'; 
var h = document.getElementsByTagName('head')[0]; 
h.appendChild(js); 
Non-blocking JavaScript
•  And what about my inline
   scripts?
•  Setup a collection (registry)
   of inline scripts
Step 1
•  Inline in the <head>:

var myapp = { 
  stuff: [] 
}; 
Step 2
•    Add to the registry

Instead of:
  <script>alert('boo!');</script> 
Do:
  <script> 
    myapp.stuff.push(function(){ 
      alert('boo!'); 
    }); 
  </script> 
Step 3
•  Execute all

var l = myapp.stuff.length;  
for(var i = 0, i < l; i++) { 
  myapp.stuff[i](); 
} 
Blocking CSS?



But they do block:
•  In FF2
•  When followed by a script
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff ✔
3.  Out of the way ✔
4.  Start early
The Waterfall
1.  Less stuff
2.  Smaller stuff
3.  Out of the way
4.  Start early
flush() early
 html
                         png

                    js               
                               css



 html



   js
        png
                                     ✔
              css
flush()
<html> 
<head> 
  <script src=quot;my.jsquot;  
   type=quot;text/javascriptquot;></script> 
  <link href=quot;my.cssquot;  
   type=quot;text/cssquot; rel=quot;stylesheetquot; /> 
</head> 
<?php flush() ?> 
<body> 
  .... 
The Waterfall
1.  Less stuff ✔
2.  Smaller stuff ✔
3.  Out of the way ✔
4.  Start early ✔
Life after onload
Life after onload
1.  Lazy-load
2.  Preload
3.  XHR
4.  JavaScript optimizations
Lazy-load

•  bells & whistles
•  badges & widgets
Preload

•  to help next page’s
waterfall
•  img, CSS, JS, DNS lookups
XHR (Ajax)

•  small – gzip, JSON
•  less – Expires 
•  GET over POST
GET vs. POST for XHR
var url = 'test.php'; 
var request =  new XMLHttpRequest(); 
request.open(quot;POSTquot;, url, false); 
// … 
request.send('test=1'); 
GET vs. POST for XHR
JavaScript optimizations
•  local vars
•  DOM
•  garbage collection
•  init-time branching
•  memoization
•  threads
Local variables

•  globals are all sorts of bad
•  use var 
•  localize globals
Local variables
var a = 1;  
(function(){ 
  var a = 2;  
  function b(){ 
    var a = 3;  
    alert(a); 
  } 
  b();  
})(); // 3 
Local variables
var a = 1;  
(function(){ 
  var a = 2;  
  function b(){ 
    // var a = 3;  
    alert(a); 
  } 
  b();  
})(); // 2 
Local variables
var a = 1;  
(function(){ 
  // var a = 2;  
  function b(){ 
    // var a = 3;  
    alert(a); 
  } 
  b();  
})(); // 1 
Local variables
•  less crawling up the scope chain
•  localize
•  function pointers too
•  help YUI compressor (it won’t rename
globals)
                         Wait!
                      Isn’t that a
                  micro-optimization?
Localize DOM access
function foo(){ 
  for (var i = 0; i < 100000; i++) { 
    document.getElementsByTagName('head'); 
  } 
} 
foo(); 
Localize DOM access
function foo(){ 
  var get = document.getElementsByTagName; 
  for (var i = 0; i < 100000; i++) { 
    get('head'); 
  } 
} 
                                          4
foo();  
                                        times
                                        faster
Touching the DOM
function foo() { 
  for (var count = 0; count < 1000; count++) { 
    document.body.innerHTML += 1; 
  } 
} 
Touching the DOM
function foo() { 
  var inner = ''; 
  for (var count = 0; count < 1000; count++) { 
    inner += 1; 
  } 
  document.body.innerHTML += inner; 
                                        1000
} 
                                        times
                                        faster
Cleaning up after yourself
•  Properties you no longer need

var myApp = { 
  prop: huge 
}; 
// ... 
delete myApp.prop; 
Cleaning up after yourself
•  DOM elements you no longer
need

var el = $('mydiv'); 
el.parentNode.removeChild(el); 
Cleaning up after yourself
•  DOM elements you no longer
need

var el = $('mydiv'); 
delete el.parentNode.removeChild(el); 
Init-time branching
•  Instead of…

function myEvent(el, type, fn) { 
  if (window.addEventListener) { 
    el.addEventListener(type, fn, false); 
  } else if (window.attachEvent) { 
    el.attachEvent(quot;onquot; + type, fn); 
  } else {… 
} 
Init-time branching
•  Do…

if (window.addEventListener) { 
  var myEvent = function (el, type, fn) { 
    el.addEventListener(type, fn, false); 
  } 
} else if (window.attachEvent) { 
  var myEvent = function (el, type, fn) { 
    el.attachEvent(quot;onquot; + type, fn); 
  } 
} 
Lazy definition

function myEvent(el, type, fn) { 
  if (window.addEventListener) { 
    myEvent = function(el, type, fn) { 
      el.addEventListener(type, fn, false); 
    }; 
  } else if (window.attachEvent) { 
    //... 
  } 
  return myEvent(el, type, fn); 
} 
Memoization
•  for expensive, repeating tasks

function myFunc(param){ 
    if (!myFunc.cache) { 
        myFunc.cache = {}; 
    } 
    if (!myFunc.cache[param]) { 
        var result = {}; // … 
        myFunc.cache[param] = result; 
    } 
    return myFunc.cache[param]; 
} 
Threads
•  Web Workers for modern browsers


var myWorker = new Worker('my_worker.js');   
myWorker.onmessage = function(event) {   
  alert(quot;Called back by the worker!quot;);   
};  

https://developer.mozilla.org/en/Using_DOM_workers
Threads
•  … or setTimeout() for the rest 

1.  Do a chunk of work 
2.  setTimeout(chunk, 1) and return/yield 
Life after onload
1.  Lazy-load ✔
2.  Preload ✔
3.  XHR ✔
4.  JavaScript optimizations ✔
YUI3




http://developer.yahoo.com/yui/3
                                
YUI3

•  Lighter
    less KB, modules, sub-modules

•  Faster
    opportunity to refactor

•  A la carte modules
YUI3 a la carte

•  Combo handler
                                                      
http://yui.yahooapis.com/combo?oop‐min.js&event‐min.js

•  Self-populating
YUI().use(“anim”, function(Y) { 
  var a = new Y.Anim({...}); 
  a.run(); 
}); 
Thank you!


Stoyan Stefanov
@stoyanstefanov
http://www.phpied.com
Credits/Further reading
•  http://looksgoodworkswell.blogspot.com/2008/06/velocity-conference-improving-netflix.html
•  http://developer.yahoo.com/yui/compressor/
•  http://www.julienlecomte.net/blog/2007/12/39/
•  http://webo.in/articles/habrahabr/46-cross-browser-data-url/
•  http://yuiblog.com/blog/2008/07/22/non-blocking-scripts
•  http://hitchhikers.wikia.com/wiki/Mostly_Harmless
•  http://developer.yahoo.com/performance/
•  http://oreilly.com/catalog/9780596522308/
•  http://oreilly.com/catalog/9780596529307/
•  http://www.nczonline.net/blog/tag/performance/
1 of 87

Recommended

Plone Interactivity by
Plone InteractivityPlone Interactivity
Plone InteractivityEric Steele
748 views194 slides
HTML5 by
HTML5HTML5
HTML5Brad Touesnard
1.1K views80 slides
Creating Responsive Experiences by
Creating Responsive ExperiencesCreating Responsive Experiences
Creating Responsive ExperiencesTim Kadlec
1.1K views100 slides
Jazz up your JavaScript: Unobtrusive scripting with JavaScript libraries by
Jazz up your JavaScript: Unobtrusive scripting with JavaScript librariesJazz up your JavaScript: Unobtrusive scripting with JavaScript libraries
Jazz up your JavaScript: Unobtrusive scripting with JavaScript librariesSimon Willison
48.2K views139 slides
Revisited by
RevisitedRevisited
RevisitedShunsaku Kudo
2K views119 slides
Turbogears Presentation by
Turbogears PresentationTurbogears Presentation
Turbogears Presentationdidip
1.3K views41 slides

More Related Content

What's hot

Makezine by
MakezineMakezine
MakezineKelly Thejitternews
555 views28 slides
Securing Rails by
Securing RailsSecuring Rails
Securing RailsAlex Payne
1.4K views32 slides
Ajax&Geoweb C by
Ajax&Geoweb CAjax&Geoweb C
Ajax&Geoweb CAyutthaya GIS
775 views48 slides
Making Mobile Sites Faster by
Making Mobile Sites FasterMaking Mobile Sites Faster
Making Mobile Sites FasterAndy Davies
13.8K views52 slides
Mocking - Visug session by
Mocking - Visug sessionMocking - Visug session
Mocking - Visug sessionMaarten Balliauw
1.3K views28 slides

What's hot(20)

Securing Rails by Alex Payne
Securing RailsSecuring Rails
Securing Rails
Alex Payne1.4K views
Making Mobile Sites Faster by Andy Davies
Making Mobile Sites FasterMaking Mobile Sites Faster
Making Mobile Sites Faster
Andy Davies13.8K views
2009 Java One State Of The Open Web by Patrick Chanezon
2009 Java One State Of The Open Web2009 Java One State Of The Open Web
2009 Java One State Of The Open Web
Patrick Chanezon7.1K views
The Need For Speed by Andy Davies
The Need For SpeedThe Need For Speed
The Need For Speed
Andy Davies2.5K views
WWW:::Mechanize YAPC::BR 2008 by mvitor
WWW:::Mechanize YAPC::BR 2008WWW:::Mechanize YAPC::BR 2008
WWW:::Mechanize YAPC::BR 2008
mvitor339 views
Webspam (English Version) by Dirk Haun
Webspam (English Version)Webspam (English Version)
Webspam (English Version)
Dirk Haun14.1K views
The web is too slow by Andy Davies
The web is too slow The web is too slow
The web is too slow
Andy Davies15.2K views
Web Unleashed '19 - Measuring the Adoption of Web Performance Techniques by Paul Calvano
Web Unleashed '19 - Measuring the Adoption of Web Performance TechniquesWeb Unleashed '19 - Measuring the Adoption of Web Performance Techniques
Web Unleashed '19 - Measuring the Adoption of Web Performance Techniques
Paul Calvano909 views
Web Security Horror Stories by Simon Willison
Web Security Horror StoriesWeb Security Horror Stories
Web Security Horror Stories
Simon Willison32.1K views
Spring aop mvc_by_sekhar_javabynatara_j by Satya Johnny
Spring aop mvc_by_sekhar_javabynatara_jSpring aop mvc_by_sekhar_javabynatara_j
Spring aop mvc_by_sekhar_javabynatara_j
Satya Johnny195 views
Taiwan Web Standards Talk 2011 by Zi Bin Cheah
Taiwan Web Standards Talk 2011Taiwan Web Standards Talk 2011
Taiwan Web Standards Talk 2011
Zi Bin Cheah1.4K views

Viewers also liked

5 Tips for Better JavaScript by
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScriptTodd Anglin
72.5K views57 slides
JavaScript - From Birth To Closure by
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To ClosureRobert Nyman
51.9K views133 slides
JavaScript and Web Standards Sitting in a Tree by
JavaScript and Web Standards Sitting in a TreeJavaScript and Web Standards Sitting in a Tree
JavaScript and Web Standards Sitting in a TreeJenn Lukas
24.3K views106 slides
Let’s talk about JavaScript - WebElement by
Let’s talk about JavaScript - WebElementLet’s talk about JavaScript - WebElement
Let’s talk about JavaScript - WebElementMarian Rusnak
809 views54 slides
Modern JavaScript Applications: Design Patterns by
Modern JavaScript Applications: Design PatternsModern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design PatternsVolodymyr Voytyshyn
37.6K views96 slides
Fundamental JavaScript [UTC, March 2014] by
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]Aaron Gustafson
8.5K views105 slides

Viewers also liked(9)

5 Tips for Better JavaScript by Todd Anglin
5 Tips for Better JavaScript5 Tips for Better JavaScript
5 Tips for Better JavaScript
Todd Anglin72.5K views
JavaScript - From Birth To Closure by Robert Nyman
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To Closure
Robert Nyman51.9K views
JavaScript and Web Standards Sitting in a Tree by Jenn Lukas
JavaScript and Web Standards Sitting in a TreeJavaScript and Web Standards Sitting in a Tree
JavaScript and Web Standards Sitting in a Tree
Jenn Lukas24.3K views
Let’s talk about JavaScript - WebElement by Marian Rusnak
Let’s talk about JavaScript - WebElementLet’s talk about JavaScript - WebElement
Let’s talk about JavaScript - WebElement
Marian Rusnak809 views
Modern JavaScript Applications: Design Patterns by Volodymyr Voytyshyn
Modern JavaScript Applications: Design PatternsModern JavaScript Applications: Design Patterns
Modern JavaScript Applications: Design Patterns
Volodymyr Voytyshyn37.6K views
Fundamental JavaScript [UTC, March 2014] by Aaron Gustafson
Fundamental JavaScript [UTC, March 2014]Fundamental JavaScript [UTC, March 2014]
Fundamental JavaScript [UTC, March 2014]
Aaron Gustafson8.5K views
Virtual machine and javascript engine by Duoyi Wu
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engine
Duoyi Wu50.9K views
The JavaScript Programming Language by guestceb98b
The JavaScript Programming LanguageThe JavaScript Programming Language
The JavaScript Programming Language
guestceb98b11.3K views

Similar to High Performance Kick Ass Web Apps (JavaScript edition)

Blueprint talk at Open Hackday London 2009 by
Blueprint talk at Open Hackday London 2009Blueprint talk at Open Hackday London 2009
Blueprint talk at Open Hackday London 2009Ricardo Varela
1.8K views21 slides
yusukebe in Yokohama.pm 090909 by
yusukebe in Yokohama.pm 090909yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909Yusuke Wada
2.2K views50 slides
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRF by
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRFBe Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRFMark Stanton
4K views53 slides
Gmr Highload Presentation Revised by
Gmr Highload Presentation RevisedGmr Highload Presentation Revised
Gmr Highload Presentation RevisedOntico
923 views30 slides
Gmr Highload Presentation by
Gmr Highload PresentationGmr Highload Presentation
Gmr Highload PresentationOntico
384 views30 slides
More Secrets of JavaScript Libraries by
More Secrets of JavaScript LibrariesMore Secrets of JavaScript Libraries
More Secrets of JavaScript Librariesjeresig
14.3K views148 slides

Similar to High Performance Kick Ass Web Apps (JavaScript edition)(20)

Blueprint talk at Open Hackday London 2009 by Ricardo Varela
Blueprint talk at Open Hackday London 2009Blueprint talk at Open Hackday London 2009
Blueprint talk at Open Hackday London 2009
Ricardo Varela1.8K views
yusukebe in Yokohama.pm 090909 by Yusuke Wada
yusukebe in Yokohama.pm 090909yusukebe in Yokohama.pm 090909
yusukebe in Yokohama.pm 090909
Yusuke Wada2.2K views
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRF by Mark Stanton
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRFBe Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Be Afraid. Be Very Afraid. Javascript security, XSS & CSRF
Mark Stanton4K views
Gmr Highload Presentation Revised by Ontico
Gmr Highload Presentation RevisedGmr Highload Presentation Revised
Gmr Highload Presentation Revised
Ontico923 views
Gmr Highload Presentation by Ontico
Gmr Highload PresentationGmr Highload Presentation
Gmr Highload Presentation
Ontico384 views
More Secrets of JavaScript Libraries by jeresig
More Secrets of JavaScript LibrariesMore Secrets of JavaScript Libraries
More Secrets of JavaScript Libraries
jeresig14.3K views
jQuery Internals + Cool Stuff by jeresig
jQuery Internals + Cool StuffjQuery Internals + Cool Stuff
jQuery Internals + Cool Stuff
jeresig6.1K views
Performance, Games, and Distributed Testing in JavaScript by jeresig
Performance, Games, and Distributed Testing in JavaScriptPerformance, Games, and Distributed Testing in JavaScript
Performance, Games, and Distributed Testing in JavaScript
jeresig2.9K views
Hacking Movable Type Training - Day 1 by Byrne Reese
Hacking Movable Type Training - Day 1Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1
Byrne Reese9.3K views
Deliverance: Plone theming without the learning curve from Plone Symposium Ea... by Jazkarta, Inc.
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
Deliverance: Plone theming without the learning curve from Plone Symposium Ea...
Jazkarta, Inc.2.3K views
Developing and testing ajax components by Ignacio Coloma
Developing and testing ajax componentsDeveloping and testing ajax components
Developing and testing ajax components
Ignacio Coloma2.1K views
Jslunch6 by Nao Haida
Jslunch6Jslunch6
Jslunch6
Nao Haida535 views
Ajax On S2 Odp by ghessler
Ajax On S2 OdpAjax On S2 Odp
Ajax On S2 Odp
ghessler483 views
yet another rails by ashok kumar
yet another railsyet another rails
yet another rails
ashok kumar483 views
Scaling Scribd by Timothy Wee
Scaling ScribdScaling Scribd
Scaling Scribd
Timothy Wee14.7K views
Scaling Rails Presentation by eraz
Scaling Rails PresentationScaling Rails Presentation
Scaling Rails Presentation
eraz984 views
Learning jQuery @ MIT by jeresig
Learning jQuery @ MITLearning jQuery @ MIT
Learning jQuery @ MIT
jeresig1.5K views

More from Stoyan Stefanov

Reactive JavaScript by
Reactive JavaScriptReactive JavaScript
Reactive JavaScriptStoyan Stefanov
5.1K views41 slides
YSlow hacking by
YSlow hackingYSlow hacking
YSlow hackingStoyan Stefanov
3.1K views27 slides
Liking performance by
Liking performanceLiking performance
Liking performanceStoyan Stefanov
2.1K views20 slides
JavaScript Performance Patterns by
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance PatternsStoyan Stefanov
4.9K views79 slides
JavaScript performance patterns by
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patternsStoyan Stefanov
8K views69 slides
High Performance Social Plugins by
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social PluginsStoyan Stefanov
3.3K views40 slides

More from Stoyan Stefanov(20)

JavaScript Performance Patterns by Stoyan Stefanov
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
Stoyan Stefanov4.9K views
High Performance Social Plugins by Stoyan Stefanov
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social Plugins
Stoyan Stefanov3.3K views
JavaScript навсякъде by Stoyan Stefanov
JavaScript навсякъдеJavaScript навсякъде
JavaScript навсякъде
Stoyan Stefanov2.2K views
JavaScript for PHP developers by Stoyan Stefanov
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov15.6K views
Progressive Downloads and Rendering - take #2 by Stoyan Stefanov
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2
Stoyan Stefanov3.3K views
Progressive Downloads and Rendering by Stoyan Stefanov
Progressive Downloads and RenderingProgressive Downloads and Rendering
Progressive Downloads and Rendering
Stoyan Stefanov6K views
Voices that matter: High Performance Web Sites by Stoyan Stefanov
Voices that matter: High Performance Web SitesVoices that matter: High Performance Web Sites
Voices that matter: High Performance Web Sites
Stoyan Stefanov1.6K views
CSS and image optimization by Stoyan Stefanov
CSS and image optimizationCSS and image optimization
CSS and image optimization
Stoyan Stefanov26.8K views
High-performance DOM scripting by Stoyan Stefanov
High-performance DOM scriptingHigh-performance DOM scripting
High-performance DOM scripting
Stoyan Stefanov2.7K views

Recently uploaded

DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...ShapeBlue
26 views29 slides
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueShapeBlue
26 views15 slides
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...ShapeBlue
40 views25 slides
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T by
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TShapeBlue
38 views34 slides
Network Source of Truth and Infrastructure as Code revisited by
Network Source of Truth and Infrastructure as Code revisitedNetwork Source of Truth and Infrastructure as Code revisited
Network Source of Truth and Infrastructure as Code revisitedNetwork Automation Forum
32 views45 slides
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ... by
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...ShapeBlue
61 views15 slides

Recently uploaded(20)

DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by ShapeBlue
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
ShapeBlue26 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue26 views
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue40 views
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T by ShapeBlue
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&TCloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
CloudStack and GitOps at Enterprise Scale - Alex Dometrius, Rene Glover - AT&T
ShapeBlue38 views
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ... by ShapeBlue
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
Backroll, News and Demo - Pierre Charton, Matthias Dhellin, Ousmane Diarra - ...
ShapeBlue61 views
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by ShapeBlue
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
ShapeBlue60 views
Why and How CloudStack at weSystems - Stephan Bienek - weSystems by ShapeBlue
Why and How CloudStack at weSystems - Stephan Bienek - weSystemsWhy and How CloudStack at weSystems - Stephan Bienek - weSystems
Why and How CloudStack at weSystems - Stephan Bienek - weSystems
ShapeBlue81 views
HTTP headers that make your website go faster - devs.gent November 2023 by Thijs Feryn
HTTP headers that make your website go faster - devs.gent November 2023HTTP headers that make your website go faster - devs.gent November 2023
HTTP headers that make your website go faster - devs.gent November 2023
Thijs Feryn26 views
State of the Union - Rohit Yadav - Apache CloudStack by ShapeBlue
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStack
ShapeBlue106 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely29 views
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava... by ShapeBlue
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
Centralized Logging Feature in CloudStack using ELK and Grafana - Kiran Chava...
ShapeBlue28 views
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas... by Bernd Ruecker
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
iSAQB Software Architecture Gathering 2023: How Process Orchestration Increas...
Bernd Ruecker48 views
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue by ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlueWhat’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
What’s New in CloudStack 4.19 - Abhishek Kumar - ShapeBlue
ShapeBlue89 views
Business Analyst Series 2023 - Week 4 Session 7 by DianaGray10
Business Analyst Series 2023 -  Week 4 Session 7Business Analyst Series 2023 -  Week 4 Session 7
Business Analyst Series 2023 - Week 4 Session 7
DianaGray1042 views
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT by ShapeBlue
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBITUpdates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
ShapeBlue66 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue71 views
Igniting Next Level Productivity with AI-Infused Data Integration Workflows by Safe Software
Igniting Next Level Productivity with AI-Infused Data Integration Workflows Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Safe Software317 views

High Performance Kick Ass Web Apps (JavaScript edition)