High-Performance JavaScript

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

11 comments

Comments 1 - 10 of 11 previous next Post a comment

  • guest483fcc guest483fcc 2 years ago
    I don't completely agree with the innerHTML suggestion. For trivial DOM adding it works, but (speaking for myself) when generating more complex html IE6+7 didn't convert the innerHTML properly. For instance while dynamically creating and filling dropdown boxes in a form. So for cross-browser compability I still use new objects and place them in the dom at the end of the creation process.
  • gauravtest50 gauravtest50 2 years ago
    nice one

  • guest450c17 guest450c17 2 years ago
    On 'big' thing this presentation does touch on is that .innerHTML...

    He did on slide 37

  • guest849c32 guest849c32 2 years ago
    On 'big' thing this presentation does touch on is that .innerHTML is much much much faster than doing DOM in most cases. The browser is built to take a string and turn it into DOM elements for you. When you do it entirely in javascript to create an render something, you're shooting yourself in the foot.



    When to use JS DOM? When manipulating an existing object, not creating it.

  • guest06ed85 guest06ed85 2 years ago
    I am a guest too

  • guest32ed13 guest32ed13 2 years ago
    I agree. Very Good! I was recently interested by IBMs article on state dependant ajax requests... IE using cookies to reply 304 messages etc. the article was on delicious a wee while ago..



    Excellent ideas!

  • guest1a98fe guest1a98fe 2 years ago
    I am a guest

  • guest405ca5 guest405ca5 2 years ago
    Under 'measure with a consistent environment' the suggestion to try multiple runs and take an average is wrong. You want to compare the fastest runs. Any run that is slower than the fastest one is probably slower because something outside your code is taking up the extra time.

  • luar luar 2 years ago
    You can see the slide synchronize video version here:
    http://www.vcasmo.com/video/osnow/391
  • pureclone pureclone 2 years ago
    Here's the link to YUI article and the video:
    http://yuiblog.com/blog/2007/08/29/video-smarr/

Comments 1 - 10 of 11 previous next

Post a comment
Embed Video
Edit your comment Cancel

52 Favorites & 4 Groups

High-Performance JavaScript - Presentation Transcript

  1. High-Performance JavaScript: Why Everything You’ve Been Taught is Wrong
    • Joseph Smarr
    • Plaxo, Inc.
  2. About me
    • Chief Platform Architect at Plaxo
      • First employee (March 2002)
      • Architect and lead developer for Plaxo Online
    • Abusing web browsers since 1993 (Mosaic)
      • Plaxo Online 2.0 (AJAX via iframes in 2004)
      • JavaScript Wormhole (OSCON 06)
    http://JosephSmarr.com
  3. About Plaxo
    • Smart Address Book
      • Syncs address book and calendar with lots of places
      • User updates their contact info  you get it automatically
    • Founded in 2002, ~50 employees, 15M+ users
      • Backed by Sequoia, Ram Shriram, Tim Koogle, et al
    http://www.plaxo.com
  4. Plaxo Online AJAX Desktop beta.plaxo.com
    • Flexible desktop
    • Contacts
    • Calendar
    • Tasks
    • Notes
    • Sync dashboard
    • Pulse
    • Profile / settings
  5. Plaxo Online AJAX Desktop beta.plaxo.com
    • Flexible desktop
    • Contacts
    • Calendar
    • Tasks
    • Notes
    • Sync dashboard
    • Pulse
    • Profile / settings
  6. Plaxo Online AJAX Desktop beta.plaxo.com
    • Flexible desktop
    • Contacts
    • Calendar
    • Tasks
    • Notes
    • Sync dashboard
    • Pulse
    • Profile / settings
  7. Looks great…but it almost didn’t ship!
    • Spring 06: “Let’s really push the envelope for Plaxo 3.0”
    • Summer 06: “Wow, these are great UI ideas, keep em coming”
    • Fall 06: “Let’s put 7 great web devs full time on this”’
    • Winter 06: “Ok, we built a ton…now let’s optimize it, no problem”
    • March 07: “Uh oh, making it fast is way harder than we thought”
    • April 07: “We can’t ship this as is—do we need to start over?!?”
    • June 07: “After a heroic effort, it’s just barely fast enough (phew!)”
  8. Where did we go wrong??
    • Didn’t take performance seriously from day one
    • Didn’t think the browser’s limitations were significant
    • Didn’t use the app daily as we were developing it
    • Didn’t push back on feature requests for performance
    • Didn’t value perceived performance / responsiveness
    • …overcoming these challenges required unlearning a lot of standard assumptions about building software…
  9. Why Everything You’ve Been Taught is Wrong
    • AJAX euphoria
      • Web browsers can be made to do anything now!
      • Use desktop / OOP programming style
    • Why it’s wrong
      • Browsers are being pushed beyond their comfort zone
      • JavaScript code is parsed & interpreted every time  cost per line of source code
  10. Why High-Performance JavaScript Matters
    • Everyone is amazed by fast apps
      • It hardly matters what else they do!
    • Everyone hates slow apps
      • It hardly matters what else they do…
    • AJAX was supposed to be all about responsiveness!!
    • Having tried and almost failed, we now have a mantra:
  11. The High-Performance JS Mantra
    • Be Lazy
    • Be Responsive
    • Be Pragmatic
    • Be Vigilant
  12. The High-Performance JS Mantra
    • Be Lazy: Nothing is faster than doing nothing
    • Be Responsive
    • Be Pragmatic
    • Be Vigilant
  13. Write less code
    • Initial parsing of JavaScript is often a major bottleneck
      • No JIT, no cached object code, interpreted every time
      • Parse time is non-linear in the size of total JavaScript?
    • Can’t rely on browser caching to excuse large code size
      • Yahoo study: surprising number of hits with empty cache
      • Frequent code releases  frequently need to re-download
    • More code = more to download, execute, maintain, etc.
      • Ideal for large AJAX apps is <500K JS uncompressed
    Be Lazy: Nothing is faster than doing nothing
  14. Total code size of some AJAX apps
  15. Write less code
    • Minimize the JavaScript code you send down
      • Minify = good, obfuscate = not much better
      • Strip debug / logging lines (don’t just set log-level = 0)
      • Remove unnecessary OOP boilerplate
        • Get/Set functions don’t actually protect member vars! etc.
    • Minimize dependency on third-party library code
      • Lots of extra code comes along that you don’t need
      • Libraries solve more general problems  use like scaffolding
    Be Lazy: Nothing is faster than doing nothing
  16. Load JavaScript on-demand
    • Once you’ve written less code, load it only as-needed
      • Break into classes / modules; use require / provide (ala dojo)
    • Bundle classes into packages to minimize server round-trips
      • Packages should ignore pre-loaded dependencies
      • Tradeoff of downloading shared code twice vs. multiple round trips (e.g. for common widgets)
    • Build packages with error-handler hook for development
      • Will re-build from source every time if you don’t write
    Be Lazy: Nothing is faster than doing nothing “ I work hard at being lazy” Ryan “Roger” Moore
  17. Draw UI as late as possible
    • Draw less DOM = faster to draw, browser less saturated
    • Never pre-draw hidden UI if you can avoid it
    • Cache previously drawn HTML when appropriate
      • But have to know when to invalidate the cache
    • Don’t keep hidden UI up-to-date behind the scenes
      • Just re-draw next time you show it (simpler, one-time cost)
    • Consider re-drawing vs. partial dynamic UI updates
      • Redraw is often faster / easier / less code
    Be Lazy: Nothing is faster than doing nothing
      • Never pre-draw hidden UI
      • Never pre-draw hidden UI
      • Never pre-draw hidden UI
      • Never pre-draw hidden UI
      • Never pre-draw hidden UI
  18. How to Be Lazy
    • Write less code!
    • Load JS on-demand
    • Draw UI as late as possible
    Be Lazy: Nothing is faster than doing nothing
  19. The High-Performance JS Mantra
    • Be Lazy
    • Be Responsive: Jump when the user says jump
    • Be Pragmatic
    • Be Vigilant
  20. Minimize initial perceived load time
    • Put CSS at the top of your page and JS at the bottom
    • Draw major placeholder UI with “loading…” first
    • Load / draw your app in stages (lazy, on-demand)
    Be Responsive: Jump when the user says jump
      • Load your app in stages
      • Load your app in stages
      • Load your app in stages
      • Load your app in stages
      • Load your app in stages
      • Load your app in stages
      • Load your app in stages
  21. Yield early and often
    • Always want to show a quick response acknowledgement
      • But browser often doesn’t update UI until your code returns!
    • Solution: do minimum work, use setTimeout(0) to yield
      • Use closures to chain state together with periodic pauses
      • Draw UI progressively, with loading messages as needed
      • Use onmousedown instead of onclick (~100msec faster!)
      • Demo: http://josephsmarr.com/oscon-js/yield.html
    Be Responsive: Jump when the user says jump
  22. Cache backend responses
    • All data requests should go through data-manager code
      • Request as needed and cache results for subsequent asks
      • Requesting code always assumes async response
    • Use range caches  only fill in missing pieces
      • Ideal for partial views into long lists of data
    • Balance local updates vs. re-fetching from APIs
      • Do the easy cases, but beware of too much update code
      • Worst case = trash cache and re-fetch = first-time case
    Be Responsive: Jump when the user says jump “ Data structures and AJAX—together at last!” Glenn “Fiddich” Dixon
  23. How to Be Responsive
    • Minimize initial perceived loading time
    • Yield early and often for responsive UI
    • Cache API responses with data-manager layer
    Be Responsive: Jump when the user says jump
  24. The High-Performance JS Mantra
    • Be Lazy
    • Be Responsive
    • Be Pragmatic: Don’t make things even harder
    • Be Vigilant
  25. Play to the browser’s strengths
    • Avoid DOM manipulation; use innerHTML and array.join(“”)
    • Avoid dynamic CSS-class definitions & CSS math
    • Avoid reflow when possible (esp. manually on browser resize)
    • Avoid memory allocation (e.g. string-splitting)
    • Do DOM manipulation off-DOM, then re-insert at the end
    Be Pragmatic: Don’t make things even harder
  26. Cheat when you can / should
    • Use global functions or IDs when reasonable
      • Finding by class / attaching event handlers is slow
      • Protect modularity only when needed (e.g. widgets)
    • Directly attach onclick , etc. handlers instead of using event listeners where appropriate
    • Use fastest find-elems available when you need to scan the DOM (don’t rely on general-purpose code)
    Be Pragmatic: Don’t make things even harder
  27. Inline initial API calls & HTML
    • Tempting to load blank page and do everything in JavaScript
      • Have to redraw UI dynamically; don’t want two copies of UI code
    • Problem: initial load is usually too slow
      • Too many round-trips to the server; too long before initial UI shows up
    • Solution: if you have to do it every time, do it statically
      • Save out initial API responses in web page
      • Use data-manager to hide pre-fetching (can change your mind later)
      • Download initial HTML in web page
    Be Pragmatic: Don’t make things even harder
  28. How to Be Pragmatic
    • Play to the browser’s strengths
    • Cheat when you can / should
    • Inline initial API calls / HTML for faster load time
    Be Pragmatic: Don’t make things even harder
  29. The High-Performance JS Mantra
    • Be Lazy
    • Be Responsive
    • Be Pragmatic
    • Be Vigilant: Only you can prevent slow web apps
  30. Profile like crazy
    • Bottlenecks abound and are usually not obvious
      • Use firebug’s profiler (Joe Hewitt, you rule!  )
      • Use timestamp diffs and alerts
      • Comment-out blocks of code
    • Measure with a consistent environment
      • Browsers bog down  always restart first
      • Try multiple runs and average (and don’t forget the cache)
    Be Vigilant: Only you can prevent slow web apps
  31. Firebug is your friend
  32. Consider performance from day one
    • Apps get slow when you make them do many / slow things!
    • Consider how much code / work is needed for each feature
      • Is it making the browser work against the grain?
      • What else is suffering for this feature? Is it worth it?
    • Make sure everyone remembers how important speed is
    Be Vigilant: Only you can prevent slow web apps
    • Building high-performance apps requires the right attitude
      • Must consider and prioritize speed in every decision
    • Ask “what features can I add within this size / speed?” vs. “how small / fast can I get this set of features?”
      • I had to learn this the hard way (Plaxo 3.0 almost didn’t ship!)
    Get your priorities straight Be Vigilant: Only you can prevent slow web apps “ Performance first, features second!” Todd & Cam
  33. How to Be Vigilant
    • Profile like crazy
    • Consider performance from day one
    • Get your priorities straight
    Be Vigilant: Only you can prevent slow web apps
  34. Conclusion: Avoid making the same mistakes we did
    • Make the browser happy … and it will make you happy
    • Web browsers are more like mobile phones than desktops
      • Limited, flimsy, temperamental platform being stretched beyond its initial design goals
      • But everyone’s got one, so it’s still the best place to be
    • Don’t push the limits unless you have to
      • Often, small quick-loading pages with AJAX interactions is best
      • Sometimes you really do need rich, interactive controls
  35. Just Remember: Everything You’ve Been Taught is Wrong
    • Think about performance — early and often
    • Write as little code as you need — each line has a cost
    • Do what the browser wants (whenever possible)
    • Remember the high-performance JavaScript mantra:
      • Be lazy
      • Be responsive
      • Be pragmatic
      • Be vigilant
    http://JosephSmarr.com

pureclonepureclone, 2 years ago

custom

39450 views, 52 favs, 34 embeds more stats

High-Performance JavaScript: Why Everything You’v more

More Info

© All Rights Reserved

Go to text version
  • Total Views 39450
    • 39143 on SlideShare
    • 307 from embeds
  • Comments 11
  • Favorites 52
  • Downloads 1612
Most viewed embeds
  • 70 views on http://labs-dev.vcasmo.com
  • 61 views on http://devolio.com
  • 30 views on http://rhio.tistory.com
  • 23 views on http://labs.vcasmo.com
  • 21 views on http://hellobmw.com

more

All embeds
  • 70 views on http://labs-dev.vcasmo.com
  • 61 views on http://devolio.com
  • 30 views on http://rhio.tistory.com
  • 23 views on http://labs.vcasmo.com
  • 21 views on http://hellobmw.com
  • 16 views on http://www.propiedadprivada.com
  • 11 views on http://ecruu.tistory.com
  • 11 views on http://www.linkist.com
  • 8 views on http://dev.vcasmo.com
  • 6 views on http://techvideos.humourbox.info
  • 6 views on http://www.createwebsite.info
  • 6 views on http://www.coderholic.com
  • 6 views on http://blog.ecmas4.com
  • 4 views on http://www.dowling.me.uk
  • 3 views on http://kwandom.com
  • 3 views on http://vcasmo.com
  • 2 views on http://ajaxian.com
  • 2 views on http://www.thinkingphp.org
  • 2 views on http://bloggermap.org
  • 2 views on http://developer.yahoo.com
  • 1 views on http://computerhumaninterface.com
  • 1 views on http://industryrobot.com
  • 1 views on http://argus.tistory.com
  • 1 views on http://freebroadbandwifi.com
  • 1 views on http://franklintnhomes.org
  • 1 views on http://www.projectzero.org
  • 1 views on http://firejune.com
  • 1 views on http://blogs.pixeldepth.net
  • 1 views on http://mixed.tistory.com
  • 1 views on http://ejohn.org
  • 1 views on http://remysharp.com
  • 1 views on http://developer.yahoo.net
  • 1 views on http://www.vcasmo.com
  • 1 views on http://192.168.3.17:3000

less

Flagged as inappropriate Flag as inappropriate
Flag as innappropriate

Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

Cancel

Categories