SlideShare a Scribd company logo
CODE MASH 2011
 DEVELOPING HIGH
PERFORMANCE WEB
       APPS
      Timothy Fisher
       Compuware
     January 14, 2011
WHO AM I?

                              Timothy Fisher
                              Technical Consultant
                              CTO Office - Emerging Technologies




                                    @tfisher
                                    tim.fisher@compuware.com
                                    www.timothyfisher.com

Download this presentation at: http://www.slideshare.net/timothyf
AGENDA
• Why   Front-end Performance Matters
• Optimize   Page Load
• Responsive   Interfaces
• Loading   and Executing JavaScript
• Data Access
AGENDA

• DOM     Scripting
• Tools

• Performance    Monitoring
• Questions


An overview to spark thought and further investigation
TRAIL BLAZERS

• Steve   Souders

• Nicholas   Zakas

• Stoyan    Stefanov

• Patrick   Meenan

• Sergey    Chernyshev
Why Front-end
Performance matters
According to Yahoo:
“80% of end-user response time is
spent on the front-end”

According to Steve Souders (Google performance guru):
“80-90% of end-user response
time is spent on the front-end”
Developing High Performance Web Apps - CodeMash 2011
Ads
                                     CDN’s




   Services
          Syndicated Content


Integration is happening on the client-side
OPTIMIZING FRONT END


•   Majority of end user response time spent on front end

•   Easier to optimize front end

•   Time spent optimizing here will have greatest impact
OPTIMIZE PAGE LOAD
PAGE LOAD TIME
              IS IMPORTANT
Page load time is critical to the success of a web site/app
         Google: +500 ms → -20% traffic

         Yahoo: +400 ms → -5-9% full-page traffic

         Amazon: +100 ms → -1% sales

Small performance flucutations affect traffic and sales!!!
BEST PRACTICES
•   Reduce HTTP Requests
    •   reduce overhead of page load

    •   combine javascript and css into less number of files

    •   combine images into sprites




•   Use a Content Delivery Network (CDN)
    •   static content delivered by fast distributed network with low latency

    •   content delivered closer to “last mile”
BEST PRACTICES
•   Make Pages Cacheable
    •   add expires header to pages

    •   use on all static content

    •   reduces HTTP requests


•   Use GZIP Page Compression
    •   all modern browsers support GZIP compression

    •   60-80% savings on text-based content

    •   No code changes required!
BEST PRACTICES
•   Place Stylesheets at the Top
    •   browser needs style info first to avoid repaints/reflows later
                                                                         CSS

    •   keep stylesheets external

    •   use <link>, do not use @import


•   Place Scripts at the Bottom
    •   allow page content to be rendered first

    •   keep scripts external to allow caching
                                                                       JavaScript
BEST PRACTICES

•   Minify JavaScript and CSS
    •   save bandwidth / download time

    •   lots of tools to automate this for you




•   Post/pre Load Components
    •   consider how you are loading content and scripts
BEST PRACTICES
•   Maximize Paralell Downloads
•   Split components across domains

•   each browser limits paralell downloads per domain

•   enables browser to load more stuff in parallel


•   Optimize Images
    •   avoid high-res images unless it is intentional

    •   don’t let the browser scale your images

    •   combine into sprites
CSS SPRITES

•   One image contains
    multiple web images

•   CSS styles used to
    display correct web
    image, i.e. position,
    background-position
RESPONSIVE INTERFACES
A SINGLE BROWSER THREAD
SINGLE THREAD
                   IMPLICATIONS
• Single   UI Thread for both UI updates and JavaScript execution

  • only   one of these can happen at a time!

  • Reason: JavaScript   may cause UI updates...

    Page downloading and rendering
    must stop and wait for scripts to be
    downloaded and executed
“0.1 second is about the limit for having the user feel
 that a system is reacting instantaneoulsy”
   - Jakob Nielsen, Usability Expert


Translation: No single JavaScript should execute for
more than 100 mS to ensure a responsive UI.
No limit to how long this can run...
  function processData(items, processor, callback) {
      for (var i=0, len=items.length; i<len; i++) {
          processor(items[i]);
      }
      callback();
  }



Will run no more than 50 mS...
  funcion timedProcessData(items, processor, callback) {
      var todo = items.concat(); // clone items
      setTimeout(funcion() {
          var start = new Date();
          do {
              processor(todo.shift());
          } while (todo.length > 0 && (new Date() - start < 50));
          if (todo.length > 0) {
               setTimeout(arguments.callee, 25);
          }
          else {
              callback(items);
          }
      }, 25);
  }
WEB WORKERS

• Commonly     associated with HTML5

• Allow   for asynchronous JavaScript execution

• JS   runs in a seperate thread isolated from the DOM

• Does    not delay UI updates

• Data   can be passed to/from Web Workers
Calling a Web Worker
    var worker = new Worker("worker.js");
    // Watch for messages from the worker
    worker.onmessage = function(e){
       // The message from the client:
       e.data
    };

    worker.postMessage("start");




The Web Worker client (worker.js)
    onmessage = function(e){
       if ( e.data === "start" ) {
         // Do some computation
         done()
       }
    };
    function done(){
       // Send back the results to the parent page
       postMessage("done");
    }
LOADING & EXECUTING
     JAVASCRIPT
WHY JAVASCRIPT?

•   Poorly written JavaScript is the most common reason
    for slow client-side performance

    • Loading

    • Parsing

    • Execution
TYPICAL JAVASCRIPT
             PLACEMENT
<html>
    <head>
        <link href=”style.css” rel=”stylesheet” type=”text/css”/>

       <script src=”myscript.js” type=”text/javascript”></script>
       <script src=”myscript.js” type=”text/javascript”></script>

       <script>
           function hello_world() {
                alert(‘hello world’);
           }
           var complex_data = // some complex calculation //
       </script>
   </head>

    <body>
        ...
    </body>
</html>
BETTER JAVASCRIPT
           PLACEMENT
<html>
    <head>
        <link href=”style.css” rel=”stylesheet” type=”text/css”/>
    </head>

   <body>
       ...

        <script src=”myscript.js” type=”text/javascript”></script>
        <script src=”myscript.js” type=”text/javascript”></script>
        <script>
            function hello_world() {
               alert(‘hello world’);
           }
            var complex_data = // some complex calculation
        </script>
    </body>
</html>
COMBINE JAVASCRIPT FILES
•   Each script request requires HTTP performance overhead

•   Minimize overhead by combining scripts


                                                  file.js
             file1.js    file2.js   file3.js




                                            =>

                       Browser                   Browser
MINIFY JAVASCRIPT

• Removes     all unecessary space/comments from your JS files

• Replace   variables with short names

• Easy   to do at built-time with a tool

• Checkout YUI    Compressor, Closure Compiler...


 Avoid manual code-size optimization!
NON-BLOCKING LOADS

• AddJavaScript to a page in a way that does not block the
 browser thread

 ‣ Dynamic Script Elements
 ‣ Script Injection
DYNAMIC SCRIPT ELEMENTS


• JavaScript
          is downloaded and executed without blocking
 other page processes.

  var script = document.createElement(‘script’);
  script.type = “text/javascript”;
  script.src = “file1.js”;
  document.getElementsByTagName(“head”)[0].appendChild(script);
SCRIPT INJECTION
• Use Ajax to get script
• Can control when script is parsed/executed
• JavaScript must be served from same domain
    var xhr = XMLHttpRequest();
    xhr.open(“get”, “file.js”, true);
    xhr.onreadystatechange = function() {
       if (xhr.readyState == 4) {
         if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {
           var script = document.createElement(“script”);
           script.type = “text/javascript”;
           script.text = xhr.responseText;
           document.body.appendChild(script);
         }
       }
    };
    xhr.send(null);
RECOMMENDED
       NONBLOCKING LOAD

• Include the code necessary to dynamically load the the rest
 of the JS required for page init

    <script type="text/javascript" src="loader.js"></script>
    <script type="text/javascript">
        loadScript("the-rest.js", function(){
            Application.init();
        });
    </script>




  Optionally include the loadScript function directly in the page
REAL WORLD USE

• This
     technique is used by many JavaScript libraries including
 YUI and Dojo.

   <script type="text/javascript"
    src="http://yui.yahooapis.com/combo?3.0.0/build/yui/yui-min.js"></script>



   YUI().use("dom", function(Y){
       Y.DOM.addClass(document.body, "loaded");
   });




   Dynamically loads the DOM utility and calls ‘loaded’ function
   when loading is complete.
OPEN SOURCE JS LOADERS

Lots of libraries available to help with the JS load problem:

         •   ControlJS

         •   LabJS

         •   RequireJS
CONTROLJS


• Progessive   Enhancement is core to ControlJS philosophy

• downloads    scripts asynchronously

• delays   script execution until aftr the page has rendered

• allows   scripts to be downloaded and not executed
CONTROLJS
                    Async JS Loading
        var cjsscript = document.createElement('script');
        cjsscript.src = "control.js";
        var cjssib = document.getElementsByTagName('script')[0];
        cjssib.parentNode.insertBefore(cjsscript, cjssib);




Replace these script includes:
<script type="text/javascript" src="main.js"></script>



with:
<script type="text/cjs" data-cjssrc="main.js"></script>
CONTROLJS

                          Delayed Execution

<script data-cjsexec=false type="text/cjs" data-cjssrc="jquery.min.js"></script>
<script data-cjsexec=false type="text/cjs" data-cjssrc="fg.menu.js"></script>




      Execute at a later time...
              examplesbtn.onclick = function() {
                 CJS.execScript("jquery.min.js");
                 CJS.execScript("fg.menu.js", createExamplesMenu);
              };
LABJS

                   Async JS Loading


<script src="LAB.js"></script>




Load these scripts asynchronously:
$LAB.script('mootools-1.3.js');



$LAB.script('mootools-1.3.js').wait()
    .script('mootools-dependent-script.js');
SUMMARY

• Browser    UI and JS share a single thread

• Code  execution blocks other browser processes such as UI
 painting

• Put   script tags at the bottom of page

• Load   as much JS dynamically as possible

• Minimize   and compress your JS
DATA ACCESS
ACCESSING DATA
How you store and access data can have a significant
impact on performance...

         JavaScript Scope Chain
SCOPE CHAIN

Bad (deeper scope chain referencing repeatedly)
function innerHTMLLoop() {
    document.getElementById('ctrl1').innerHTML += 'a';
    document.getElementById('ctrl1').innerHTML += 'b';
    document.getElementById('ctrl1').innerHTML += 'c';
}




Better (save globals to local variables)
function innerHTMLLoop2() {
    var el = document.getElementById('ctrl1');
    el.innerHTML += 'a';
    el.innerHTML += 'b';
    el.innerHTML += ‘c’;
}
DOM SCRIPTING
DOCUMENT OBJECT MODEL


 • Document Object Model (DOM) is a language
  independent API for working with HTML and XML


 • DOM  Scripting is expensive and a common cause of
  performance problems
DOM/JS ISOLATION

•   DOM and JavaScript implementations are independent
    of each other in all major browsers

•   This causes overhead performance costs as these two
    pieces of code must interface


            JavaScri
                                      DOM
               pt


      Minimize how many times you cross this bridge
BAD DOM SCRIPTING

Bad (we cross the bridge 1500 times!)
function innerHTMLLoop() {
    for (var count = 0; count < 1500; count++) {
        document.getElementById('here').innerHTML += 'a';
    }
}




Good (we cross the bridge 1 time)
function innerHTMLLoop2() {
    var content = '';
    for (var count = 0; count < 1500; count++) {
        content += 'a';
    }
    document.getElementById('here').innerHTML += content;
}
REPAINTS AND REFLOWS
  A reflow occurs whenever you change the
  geometry of an element that is displayed on the
  page.

  A repaint occurs whenever you change the
  content of an element that is displayed on the
  screen.

These are both expensive operations in terms of performance!
AVOIDING REPAINTS/REFLOWS
  This will potentially cause 3 repaints/reflows...
  var el = document.getElementById('mydiv');
  el.style.borderLeft = '1px';
  el.style.borderRight = '2px';
  el.style.padding = '5px';




  Better...    1 repaint/reflow
  var el = document.getElementById('mydiv');
  el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;';


  or...
  var el = document.getElementById('mydiv');
  el.className = 'active';
TOOLS
TOOLS ARE YOUR FRIEND
The right tools can help a developer identify and fix
performance problems related to client-side behaviour.

  Profiling
  Timing functions and operations during script
  execution

  Network Analysis
  Examine loading of images, stylesheets, and scripts
  and their effect on page load and rendering
FIREBUG
•Firefox plugin
•Debug JavaScript
•View page load waterfall:
PAGE SPEED
•Extension to Firebug from Google
•Provides tips for improving page performance
Y-SLOW

•Extension to Firebug from Yahoo
•tips for improving page performance
DYNATRACE AJAX EDITION

•extension for IE, coming soon for Firefox
•deeper client-side tracing than the firebug extensions
SPEED TRACER

•performance extension for Google Chrome
•similar features to Dynatrace Ajax
YUI PROFILER
•profile JavaScript performance
•developer must insert JS code
MORE TOOLS...

Internet Explorer Developer Tools

Safari Web Inspector

Chrome Developer Tools


Lots of developer tools to debug performance!
PERFOMANCE MONITORING
SHOWSLOW

 collects:
   YSlow
   PageSpeed
   Dyantrace

Integrate with
WebPageTest
to run tests.



                 http://www.showslow.com/
WEB PAGE TEST

Tests against
dedicated nodes.

Agent deployed
on test nodes.

Image capture




                     http://www.webpagetest.org/
BOOMERANG
                              <html>
                                <head>

JavaScript library for Real
                                  <script src="boomerang.js" type="text/javascript"></script>
                                  <script type="text/javascript">
                                       BOOMR.init({
User Monitoring (RUM)         
     
    beacon_url: "http://yoursite.com/path/to/beacon.php"
                                       });
                                      BOOMR.plugins.RT.startTimer("t_head");
                                   </script>

Released by Yahoo in               <title>page title</title>
                                   <meta http-equiv="Content-type" content="text/html; charset=utf-8">

2010                               <link rel="stylesheet" type="text/css" href="../boomerang-docs.css">
                                   <script type="text/javascript">
                                      BOOMR.plugins.RT.endTimer("t_head").startTimer("t_body");
                                    </script>
                                  </head>

Beacon metrics to a               <body>
                                    page body here

central server                      <script type="text/javascript">
                                      BOOMR.plugins.RT.endTimer("t_body");
                                  </script>
                                </body>
                              </html>



                    https://github.com/yahoo/boomerang
W3C WEB PERFORMANCE
New W3C Working Group focused on web performance.

First recommendations:
 Navigation Timing - how fast does the page load
 Resource Timing - how fast do page resources load
 User Timing - user defined custom timing events


                http://www.w3.org/2010/webperf/
DON’T WANT TO DO
ALL OF THIS YOURSELF???
End-to-end application performance monitoring
RESOURCES
•   Yahoo Exceptional Performance
    http://developer.yahoo.com/performance/

•   Google Web Performance
    http://code.google.com/speed

•   JavaScript: The Good Parts by Douglas Crockford

•   High Performance JavaScript by Nicholas Zakas

•   Even Faster Websites by Steve Souders

•   Steve Souders Site
    http://www.stevesouders.com

•   John Resig’s Blog
    http://www.ejohn.org
QUESTIONS

More Related Content

What's hot (20)

PPTX
Service workers your applications never felt so good
Chris Love
 
PDF
jQuery Chicago 2014 - Next-generation JavaScript Testing
Vlad Filippov
 
PDF
Using Web Standards to create Interactive Data Visualizations for the Web
philogb
 
PDF
High Performance Web - Full Stack Toronto
Maximiliano Firtman
 
PPTX
Disrupting the application eco system with progressive web applications
Chris Love
 
PPTX
Html5 Fit: Get Rid of Love Handles
Chris Love
 
PDF
Mobile web performance dwx13
Avenga Germany GmbH
 
PDF
Adobe AEM CQ5 - Developer Introduction
Yash Mody
 
PDF
There Are No “Buts” in Progressive Enhancement [Øredev 2015]
Aaron Gustafson
 
PDF
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
David Kaneda
 
KEY
jQuery Conference Boston 2011 CouchApps
Bradley Holt
 
PPTX
10 things you can do to speed up your web app today 2016
Chris Love
 
PDF
State of jQuery June 2013 - Portland
dmethvin
 
PDF
Going Fast on the Mobile Web
Jason Grigsby
 
PPTX
jQuery - the world's most popular java script library comes to XPages
Mark Roden
 
PDF
Responsive Images and Performance
Maximiliano Firtman
 
PPTX
Optimizing Your WordPress Site: Why speed matters, and how to get there
Stephen Bell
 
KEY
Thats Not Flash?
Mike Wilcox
 
KEY
Rails Performance Tricks and Treats
Marshall Yount
 
PDF
Real World Progressive Web Apps (Building Flipkart Lite)
Abhinav Rastogi
 
Service workers your applications never felt so good
Chris Love
 
jQuery Chicago 2014 - Next-generation JavaScript Testing
Vlad Filippov
 
Using Web Standards to create Interactive Data Visualizations for the Web
philogb
 
High Performance Web - Full Stack Toronto
Maximiliano Firtman
 
Disrupting the application eco system with progressive web applications
Chris Love
 
Html5 Fit: Get Rid of Love Handles
Chris Love
 
Mobile web performance dwx13
Avenga Germany GmbH
 
Adobe AEM CQ5 - Developer Introduction
Yash Mody
 
There Are No “Buts” in Progressive Enhancement [Øredev 2015]
Aaron Gustafson
 
How to Develop a Rich, Native-quality User Experience for Mobile Using Web St...
David Kaneda
 
jQuery Conference Boston 2011 CouchApps
Bradley Holt
 
10 things you can do to speed up your web app today 2016
Chris Love
 
State of jQuery June 2013 - Portland
dmethvin
 
Going Fast on the Mobile Web
Jason Grigsby
 
jQuery - the world's most popular java script library comes to XPages
Mark Roden
 
Responsive Images and Performance
Maximiliano Firtman
 
Optimizing Your WordPress Site: Why speed matters, and how to get there
Stephen Bell
 
Thats Not Flash?
Mike Wilcox
 
Rails Performance Tricks and Treats
Marshall Yount
 
Real World Progressive Web Apps (Building Flipkart Lite)
Abhinav Rastogi
 

Similar to Developing High Performance Web Apps - CodeMash 2011 (20)

PDF
Developing High Performance Web Apps
Timothy Fisher
 
PDF
Ajax Performance Tuning and Best Practices
Doris Chen
 
PDF
Performance Optimization and JavaScript Best Practices
Doris Chen
 
PDF
Performance on the Yahoo! Homepage
Nicholas Zakas
 
KEY
A rough guide to JavaScript Performance
allmarkedup
 
PDF
Building performance into the new yahoo homepage presentation
masudakram
 
PDF
Front-end optimisation & jQuery Internals (Pycon)
Artur Cistov
 
PPTX
Presentation Tier optimizations
Anup Hariharan Nair
 
PPTX
7 tips for javascript rich ajax websites
oazabir
 
PDF
Even faster web sites 1st Edition Steve Souders
huapepotts09
 
PDF
PrairieDevCon 2014 - Web Doesn't Mean Slow
dmethvin
 
KEY
Optimization of modern web applications
Eugene Lazutkin
 
PPTX
Building high performance web apps.
Arshak Movsisyan
 
PDF
Front-end optimisation & jQuery Internals
Artur Cistov
 
PDF
High Performance JavaScript Build Faster Web Application Interfaces 1st Editi...
yarecofuxxa58
 
PDF
Client-side Web Performance Optimization [paper]
Jakob
 
PDF
Tech Headline - JavaScript Performance
Rodrigo Castilho
 
PPT
High Performance Ajax Applications 1197671494632682 2
Niti Chotkaew
 
PPT
High Performance Ajax Applications
Julien Lecomte
 
PDF
Js Saturday 2013 your jQuery could perform better
Ivo Andreev
 
Developing High Performance Web Apps
Timothy Fisher
 
Ajax Performance Tuning and Best Practices
Doris Chen
 
Performance Optimization and JavaScript Best Practices
Doris Chen
 
Performance on the Yahoo! Homepage
Nicholas Zakas
 
A rough guide to JavaScript Performance
allmarkedup
 
Building performance into the new yahoo homepage presentation
masudakram
 
Front-end optimisation & jQuery Internals (Pycon)
Artur Cistov
 
Presentation Tier optimizations
Anup Hariharan Nair
 
7 tips for javascript rich ajax websites
oazabir
 
Even faster web sites 1st Edition Steve Souders
huapepotts09
 
PrairieDevCon 2014 - Web Doesn't Mean Slow
dmethvin
 
Optimization of modern web applications
Eugene Lazutkin
 
Building high performance web apps.
Arshak Movsisyan
 
Front-end optimisation & jQuery Internals
Artur Cistov
 
High Performance JavaScript Build Faster Web Application Interfaces 1st Editi...
yarecofuxxa58
 
Client-side Web Performance Optimization [paper]
Jakob
 
Tech Headline - JavaScript Performance
Rodrigo Castilho
 
High Performance Ajax Applications 1197671494632682 2
Niti Chotkaew
 
High Performance Ajax Applications
Julien Lecomte
 
Js Saturday 2013 your jQuery could perform better
Ivo Andreev
 
Ad

Recently uploaded (20)

PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
July Patch Tuesday
Ivanti
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PPTX
Designing Production-Ready AI Agents
Kunal Rai
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
July Patch Tuesday
Ivanti
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Biography of Daniel Podor.pdf
Daniel Podor
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Designing Production-Ready AI Agents
Kunal Rai
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Ad

Developing High Performance Web Apps - CodeMash 2011

  • 1. CODE MASH 2011 DEVELOPING HIGH PERFORMANCE WEB APPS Timothy Fisher Compuware January 14, 2011
  • 2. WHO AM I? Timothy Fisher Technical Consultant CTO Office - Emerging Technologies @tfisher tim.fi[email protected] www.timothyfisher.com Download this presentation at: http://www.slideshare.net/timothyf
  • 3. AGENDA • Why Front-end Performance Matters • Optimize Page Load • Responsive Interfaces • Loading and Executing JavaScript • Data Access
  • 4. AGENDA • DOM Scripting • Tools • Performance Monitoring • Questions An overview to spark thought and further investigation
  • 5. TRAIL BLAZERS • Steve Souders • Nicholas Zakas • Stoyan Stefanov • Patrick Meenan • Sergey Chernyshev
  • 7. According to Yahoo: “80% of end-user response time is spent on the front-end” According to Steve Souders (Google performance guru): “80-90% of end-user response time is spent on the front-end”
  • 9. Ads CDN’s Services Syndicated Content Integration is happening on the client-side
  • 10. OPTIMIZING FRONT END • Majority of end user response time spent on front end • Easier to optimize front end • Time spent optimizing here will have greatest impact
  • 12. PAGE LOAD TIME IS IMPORTANT Page load time is critical to the success of a web site/app Google: +500 ms → -20% traffic Yahoo: +400 ms → -5-9% full-page traffic Amazon: +100 ms → -1% sales Small performance flucutations affect traffic and sales!!!
  • 13. BEST PRACTICES • Reduce HTTP Requests • reduce overhead of page load • combine javascript and css into less number of files • combine images into sprites • Use a Content Delivery Network (CDN) • static content delivered by fast distributed network with low latency • content delivered closer to “last mile”
  • 14. BEST PRACTICES • Make Pages Cacheable • add expires header to pages • use on all static content • reduces HTTP requests • Use GZIP Page Compression • all modern browsers support GZIP compression • 60-80% savings on text-based content • No code changes required!
  • 15. BEST PRACTICES • Place Stylesheets at the Top • browser needs style info first to avoid repaints/reflows later CSS • keep stylesheets external • use <link>, do not use @import • Place Scripts at the Bottom • allow page content to be rendered first • keep scripts external to allow caching JavaScript
  • 16. BEST PRACTICES • Minify JavaScript and CSS • save bandwidth / download time • lots of tools to automate this for you • Post/pre Load Components • consider how you are loading content and scripts
  • 17. BEST PRACTICES • Maximize Paralell Downloads • Split components across domains • each browser limits paralell downloads per domain • enables browser to load more stuff in parallel • Optimize Images • avoid high-res images unless it is intentional • don’t let the browser scale your images • combine into sprites
  • 18. CSS SPRITES • One image contains multiple web images • CSS styles used to display correct web image, i.e. position, background-position
  • 21. SINGLE THREAD IMPLICATIONS • Single UI Thread for both UI updates and JavaScript execution • only one of these can happen at a time! • Reason: JavaScript may cause UI updates... Page downloading and rendering must stop and wait for scripts to be downloaded and executed
  • 22. “0.1 second is about the limit for having the user feel that a system is reacting instantaneoulsy” - Jakob Nielsen, Usability Expert Translation: No single JavaScript should execute for more than 100 mS to ensure a responsive UI.
  • 23. No limit to how long this can run... function processData(items, processor, callback) { for (var i=0, len=items.length; i<len; i++) { processor(items[i]); } callback(); } Will run no more than 50 mS... funcion timedProcessData(items, processor, callback) { var todo = items.concat(); // clone items setTimeout(funcion() { var start = new Date(); do { processor(todo.shift()); } while (todo.length > 0 && (new Date() - start < 50)); if (todo.length > 0) { setTimeout(arguments.callee, 25); } else { callback(items); } }, 25); }
  • 24. WEB WORKERS • Commonly associated with HTML5 • Allow for asynchronous JavaScript execution • JS runs in a seperate thread isolated from the DOM • Does not delay UI updates • Data can be passed to/from Web Workers
  • 25. Calling a Web Worker var worker = new Worker("worker.js"); // Watch for messages from the worker worker.onmessage = function(e){ // The message from the client: e.data }; worker.postMessage("start"); The Web Worker client (worker.js) onmessage = function(e){ if ( e.data === "start" ) { // Do some computation done() } }; function done(){ // Send back the results to the parent page postMessage("done"); }
  • 26. LOADING & EXECUTING JAVASCRIPT
  • 27. WHY JAVASCRIPT? • Poorly written JavaScript is the most common reason for slow client-side performance • Loading • Parsing • Execution
  • 28. TYPICAL JAVASCRIPT PLACEMENT <html> <head> <link href=”style.css” rel=”stylesheet” type=”text/css”/> <script src=”myscript.js” type=”text/javascript”></script> <script src=”myscript.js” type=”text/javascript”></script> <script> function hello_world() { alert(‘hello world’); } var complex_data = // some complex calculation // </script> </head> <body> ... </body> </html>
  • 29. BETTER JAVASCRIPT PLACEMENT <html> <head> <link href=”style.css” rel=”stylesheet” type=”text/css”/> </head> <body> ... <script src=”myscript.js” type=”text/javascript”></script> <script src=”myscript.js” type=”text/javascript”></script> <script> function hello_world() { alert(‘hello world’); } var complex_data = // some complex calculation </script> </body> </html>
  • 30. COMBINE JAVASCRIPT FILES • Each script request requires HTTP performance overhead • Minimize overhead by combining scripts file.js file1.js file2.js file3.js => Browser Browser
  • 31. MINIFY JAVASCRIPT • Removes all unecessary space/comments from your JS files • Replace variables with short names • Easy to do at built-time with a tool • Checkout YUI Compressor, Closure Compiler... Avoid manual code-size optimization!
  • 32. NON-BLOCKING LOADS • AddJavaScript to a page in a way that does not block the browser thread ‣ Dynamic Script Elements ‣ Script Injection
  • 33. DYNAMIC SCRIPT ELEMENTS • JavaScript is downloaded and executed without blocking other page processes. var script = document.createElement(‘script’); script.type = “text/javascript”; script.src = “file1.js”; document.getElementsByTagName(“head”)[0].appendChild(script);
  • 34. SCRIPT INJECTION • Use Ajax to get script • Can control when script is parsed/executed • JavaScript must be served from same domain var xhr = XMLHttpRequest(); xhr.open(“get”, “file.js”, true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) { var script = document.createElement(“script”); script.type = “text/javascript”; script.text = xhr.responseText; document.body.appendChild(script); } } }; xhr.send(null);
  • 35. RECOMMENDED NONBLOCKING LOAD • Include the code necessary to dynamically load the the rest of the JS required for page init <script type="text/javascript" src="loader.js"></script> <script type="text/javascript"> loadScript("the-rest.js", function(){ Application.init(); }); </script> Optionally include the loadScript function directly in the page
  • 36. REAL WORLD USE • This technique is used by many JavaScript libraries including YUI and Dojo. <script type="text/javascript" src="http://yui.yahooapis.com/combo?3.0.0/build/yui/yui-min.js"></script> YUI().use("dom", function(Y){ Y.DOM.addClass(document.body, "loaded"); }); Dynamically loads the DOM utility and calls ‘loaded’ function when loading is complete.
  • 37. OPEN SOURCE JS LOADERS Lots of libraries available to help with the JS load problem: • ControlJS • LabJS • RequireJS
  • 38. CONTROLJS • Progessive Enhancement is core to ControlJS philosophy • downloads scripts asynchronously • delays script execution until aftr the page has rendered • allows scripts to be downloaded and not executed
  • 39. CONTROLJS Async JS Loading var cjsscript = document.createElement('script'); cjsscript.src = "control.js"; var cjssib = document.getElementsByTagName('script')[0]; cjssib.parentNode.insertBefore(cjsscript, cjssib); Replace these script includes: <script type="text/javascript" src="main.js"></script> with: <script type="text/cjs" data-cjssrc="main.js"></script>
  • 40. CONTROLJS Delayed Execution <script data-cjsexec=false type="text/cjs" data-cjssrc="jquery.min.js"></script> <script data-cjsexec=false type="text/cjs" data-cjssrc="fg.menu.js"></script> Execute at a later time... examplesbtn.onclick = function() { CJS.execScript("jquery.min.js"); CJS.execScript("fg.menu.js", createExamplesMenu); };
  • 41. LABJS Async JS Loading <script src="LAB.js"></script> Load these scripts asynchronously: $LAB.script('mootools-1.3.js'); $LAB.script('mootools-1.3.js').wait() .script('mootools-dependent-script.js');
  • 42. SUMMARY • Browser UI and JS share a single thread • Code execution blocks other browser processes such as UI painting • Put script tags at the bottom of page • Load as much JS dynamically as possible • Minimize and compress your JS
  • 44. ACCESSING DATA How you store and access data can have a significant impact on performance... JavaScript Scope Chain
  • 45. SCOPE CHAIN Bad (deeper scope chain referencing repeatedly) function innerHTMLLoop() { document.getElementById('ctrl1').innerHTML += 'a'; document.getElementById('ctrl1').innerHTML += 'b'; document.getElementById('ctrl1').innerHTML += 'c'; } Better (save globals to local variables) function innerHTMLLoop2() { var el = document.getElementById('ctrl1'); el.innerHTML += 'a'; el.innerHTML += 'b'; el.innerHTML += ‘c’; }
  • 47. DOCUMENT OBJECT MODEL • Document Object Model (DOM) is a language independent API for working with HTML and XML • DOM Scripting is expensive and a common cause of performance problems
  • 48. DOM/JS ISOLATION • DOM and JavaScript implementations are independent of each other in all major browsers • This causes overhead performance costs as these two pieces of code must interface JavaScri DOM pt Minimize how many times you cross this bridge
  • 49. BAD DOM SCRIPTING Bad (we cross the bridge 1500 times!) function innerHTMLLoop() { for (var count = 0; count < 1500; count++) { document.getElementById('here').innerHTML += 'a'; } } Good (we cross the bridge 1 time) function innerHTMLLoop2() { var content = ''; for (var count = 0; count < 1500; count++) { content += 'a'; } document.getElementById('here').innerHTML += content; }
  • 50. REPAINTS AND REFLOWS A reflow occurs whenever you change the geometry of an element that is displayed on the page. A repaint occurs whenever you change the content of an element that is displayed on the screen. These are both expensive operations in terms of performance!
  • 51. AVOIDING REPAINTS/REFLOWS This will potentially cause 3 repaints/reflows... var el = document.getElementById('mydiv'); el.style.borderLeft = '1px'; el.style.borderRight = '2px'; el.style.padding = '5px'; Better... 1 repaint/reflow var el = document.getElementById('mydiv'); el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;'; or... var el = document.getElementById('mydiv'); el.className = 'active';
  • 52. TOOLS
  • 53. TOOLS ARE YOUR FRIEND The right tools can help a developer identify and fix performance problems related to client-side behaviour. Profiling Timing functions and operations during script execution Network Analysis Examine loading of images, stylesheets, and scripts and their effect on page load and rendering
  • 55. PAGE SPEED •Extension to Firebug from Google •Provides tips for improving page performance
  • 56. Y-SLOW •Extension to Firebug from Yahoo •tips for improving page performance
  • 57. DYNATRACE AJAX EDITION •extension for IE, coming soon for Firefox •deeper client-side tracing than the firebug extensions
  • 58. SPEED TRACER •performance extension for Google Chrome •similar features to Dynatrace Ajax
  • 59. YUI PROFILER •profile JavaScript performance •developer must insert JS code
  • 60. MORE TOOLS... Internet Explorer Developer Tools Safari Web Inspector Chrome Developer Tools Lots of developer tools to debug performance!
  • 62. SHOWSLOW collects: YSlow PageSpeed Dyantrace Integrate with WebPageTest to run tests. http://www.showslow.com/
  • 63. WEB PAGE TEST Tests against dedicated nodes. Agent deployed on test nodes. Image capture http://www.webpagetest.org/
  • 64. BOOMERANG <html> <head> JavaScript library for Real <script src="boomerang.js" type="text/javascript"></script> <script type="text/javascript"> BOOMR.init({ User Monitoring (RUM) beacon_url: "http://yoursite.com/path/to/beacon.php" }); BOOMR.plugins.RT.startTimer("t_head"); </script> Released by Yahoo in <title>page title</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> 2010 <link rel="stylesheet" type="text/css" href="../boomerang-docs.css"> <script type="text/javascript"> BOOMR.plugins.RT.endTimer("t_head").startTimer("t_body"); </script> </head> Beacon metrics to a <body> page body here central server <script type="text/javascript"> BOOMR.plugins.RT.endTimer("t_body"); </script> </body> </html> https://github.com/yahoo/boomerang
  • 65. W3C WEB PERFORMANCE New W3C Working Group focused on web performance. First recommendations: Navigation Timing - how fast does the page load Resource Timing - how fast do page resources load User Timing - user defined custom timing events http://www.w3.org/2010/webperf/
  • 66. DON’T WANT TO DO ALL OF THIS YOURSELF???
  • 68. RESOURCES • Yahoo Exceptional Performance http://developer.yahoo.com/performance/ • Google Web Performance http://code.google.com/speed • JavaScript: The Good Parts by Douglas Crockford • High Performance JavaScript by Nicholas Zakas • Even Faster Websites by Steve Souders • Steve Souders Site http://www.stevesouders.com • John Resig’s Blog http://www.ejohn.org

Editor's Notes