SlideShare a Scribd company logo
Client-Side Performance Sucks Craig Walker, Chief Technology Officer And what you can do to make it suck less. www.xero.com
Your typical internal network: Easier to control Easier to predict Knowledge of almost everything from LAN speed to operating system
There's a reason why the words “world” and “wide” are in the acronym Control and knowledge are limited to your own environment. Even how the packets fly around the internet is out of your control. www.xero.com
The HTTP Request Server Browser Receive Last Byte Send  Last Byte Send Data Establish  Connection Initial Connection Open Socket Initial HTTP Request First Byte Receive First Byte Send  First Byte Content Download ISP Get IP DNS Lookup
5% Server side performance often not the problem with response time 95% Most of the response time is taken up here
25% 75%
Empty Cache Primed Cache
Focus on the front-end 75-95% of the end-user response time for Xero customers is spent on the front end Much easier to optimise than server side performance Greater potential for improvement – especially from an end-users point-of-view Proven to work
Performance === Usability www.xero.com
The giants who’s shoulders I’m standing on Yahoo! Exceptional Performance team http://developer.yahoo.com/performance/ Steve Souders Former Chief of Performance at Yahoo! Now at Google Creator of YSlow and the 14 Rules Author of High Performance Web Sites Stoyan Stefanov, Patrick Meenan, Julien Lecomte, Stuart Colville, Ed Eliot and many more …
Zip It! Significantly reduces download size – 60-80% saving on text based content 90% of browsers support compression Benefits ALL users Zip everything you can html (aspx), js, css, xml, txt, json (ashx, axd) Benefits you too: Reduces traffic costs Doesn’t require code changes
Fly’s down Zipped
Reduce HTTP Requests Less components means a faster page Every request is an overhead Combine scripts Combine CSS Combine images into CSS Sprites Don’t rely on cache: 304’s are still requests
CSS Sprites Combine all small images into one large image Use CSS to control the displaying of each image
The designers want what? 11 Images 11 HTTP Requests 3.3 KB total size
Obey your thirst ® 1 Image 1 HTTP Request 1.6 KB total size
And the CSS? <div class=&quot;buttons&quot;> <span class=&quot;large green button&quot;> <button type=&quot;button&quot;> <span class=&quot;checkbox icon&quot;> Approve </span> </button> </span> <span class=&quot;large blue button&quot;> <button type=&quot;button&quot;> <span> Save </span> </button> </span> <span class=&quot;large red button&quot;> <button type=&quot;button&quot;> <span class=&quot;delete icon&quot;> Delete </span> </button> </span> <span class=&quot;medium gray button&quot;> <button type=&quot;button&quot;> <span class=&quot;delete icon&quot;> Cancel </span> </button> </span> </div> .buttons span.button { background:transparent url(buttons.png) no-repeat 0 0; } .buttons span.button button, .buttons span.button a { background:transparent url(buttons.png) no-repeat 100% -120px; } .buttons span.blue { background-position: 0 -30px; } .buttons span.blue button, .buttons span.blue a { background-position: 100% -150px; } .buttons span.red { background-position: 0 -60px; } .buttons span.red button, .buttons span.red a { background-position: 100% -180px; } .buttons span.green { background-position: 0 -90px; } .buttons span.green button, .buttons span.green a { background-position: 100% -210px; } The HTML The CSS
Maximise Parallel Downloads Most browsers are limited to 6 connections total and 2 connections per hostname Increase the number of hostnames to increase the number of parallel downloads  (e.g., go.xero.com, gos1.xero.com, gos2.xero.com) Don’t overdo it! (DNS lookups are expensive so limit 2-4 domains) Browser Parallel Downloads Firefox 2 2 Firefox 3 6 Internet Explorer 7 2 Internet Explorer 8 6 Safari 3.1 4 Safari 4.0 4
Maximise Parallel Downloads Stepped download  (with 1 hostname) Increased parallelism  (using 2 hostnames)
Use a CDN Content Delivery Network Distributes content closer to the last mile Distribute your static content before distributing your dynamic content Akamai most popular but very expensive Xero utilises a rudimentary CDN using IP lookup to determine location
How it works: Images JS CSS <xsl:value-of select=&quot;Page:RegisterCSS('/common/style/xero.css','screen')&quot;/> <xsl:value-of select=&quot;Page:RegisterJavascript('/common/scripts/xero.js'&quot;/>  <link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot;  href=&quot;https://nzs1.xero.com/common/style/xero.css&quot; /> <script type=&quot;text/javascript&quot;  src=&quot;https://nzs2.xero.com/common/scripts/xero.js&quot;></script> GET Request Response with HTML document Get  location  from IP
Maximise the cache Understand the ratio of cached vs uncached Add an Expires header Not just for images – should be used on all static content Set a “Never expire” or far future expires policy if you can Reduces HTTP requests – once component is served, the browser never asks for it again Date stamping in file names makes it easier Remove ETags ETags are another caching mechanism – sent with every request Uniquely created per web server – not good in web farms Just turn them off and use Expires headers instead
CSS external and on top Move all inline CSS to external style sheets for both reuse and caching Put all style sheet references at the top Firefox and IE will block rendering until all the CSS is downloaded Use <link> and NOT @import In IE @import is the same as putting <link> at the bottom
JavaScript external and on the bottom Move scripts to external files for both reuse and caching Promotes better script design Push scripts as low as possible Often difficult with document.write or with inline calls requiring loaded JavaScript Be pragmatic – think about splitting JavaScript into “must be loaded” and “can be loaded on demand” Scripts will block both downloading and rendering until parsed Remove duplicate scripts (IE has a habit of downloading them again)
Notice the  parallel  download here … …  until we hit the JavaScript files where they come down sequentially, blocking any other downloads
Minify all static content CSS, JavaScript, XML, JSON, HTML can all be minified Not a replacement for gzipping but is a perfect accompaniment to it Lots of tools: JSMin CSSTidy YUI Compressor JavaScript obfuscation can also be useful – just test that your app still works afterwards
Optimise images Use PNGs instead of GIFs Avoid alpha filters – can block rendering and freeze the browser PNG8 is best and supported by IE6 (yes – even with transparency) Optimise further with PNGOUT or PNGCRUSH Make sure you have a favicon.ico Every browser will request it Best not to respond with a 404 Make it small and cacheable
Preloading … Preload components you’ll need in the future Unconditional preload  Xero login page preloads all core components so that the dashboard experience is better Conditional preload Often based on where you think a user might go to next
Reduce cookie weight Cookie’s are sent back with every request Keep cookie size small and only store what’s required – use server-side storage for everything else Consider cookie free domains for static content
Keep it clean Choose a good Ajax library – don’t go writing this stuff yourself Always asynchronous Use JSON over XML Accessing JSON faster and cheaper Less overhead than XML Use GET requests over POSTs wherever possible POST is a 2-step process: send headers, send body POST without a body is essentially a GET anyway And make sure the response is zipped!
Things to take away Focus on the front-end Be an advocate for your users Don’t let designers get in the way of performance But they will so optimise, optimise, optimise!
YSlow Firebug extension Grades performance – not about response times but about how well a site has adopted the techniques suggested Response time inversely proportional to YSlow score – get as close to an A as possible to get the maximum performance gain
Fiddler Microsoft built HTTP debugging proxy Inspect HTTP traffic, tamper with incoming and outgoing data and debug performance issues Works with all browsers
AOL PageTest Internal AOL utility gone public Browser plug-in for Internet Explorer Visually displays underlying requests and provides suggestions on how to improve your response times Also available as an external web-based tester at www.webpagetest.org
Any questions? www.xero.com
www.xero.com 0800 GET XERO

More Related Content

PDF
Profilling client performance
PPTX
Client side performance analysis
PDF
Effectively Monitoring Client-Side Performance
PPTX
Front end optimization
PPTX
Website Performance
PPT
Front End Website Optimization
ODP
Front-End Performance Optimizing
PPTX
Caching 101
Profilling client performance
Client side performance analysis
Effectively Monitoring Client-Side Performance
Front end optimization
Website Performance
Front End Website Optimization
Front-End Performance Optimizing
Caching 101

What's hot (20)

PPTX
Automated Testing with Google Chrome - WebDriver- ChromeDriver
PDF
Do things faster and better with WebAssembly - Sendil Kumar Nellaiyapen - Cod...
PPTX
How to make your site 5 times faster in 10 minutes
PPTX
Front-End Web Performance Optimization by BucketSoft
PDF
How To Combine Back-End 
 & Front-End Testing with BlazeMeter & Sauce Labs
PPSX
Magento performancenbs
PDF
WordCamp RVA 2011 - Performance & Tuning
PPTX
Wordcamp2009
PDF
UXify 2015 - Front-end Developers' Checklist for Better UX
PDF
Universal React apps in Next.js
PDF
Metarefresh
PPTX
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
PPTX
High Performance Web/Mobile Pages - Automation
PPTX
DeepCrawl Webinar: Performing SEO on the Edge
PDF
How to Speed Up Your Joomla! Site
PPTX
SQL Server - CLR integration
PDF
NextJS - Online Summit for Frontend Developers September 2020
PDF
NextJS, A JavaScript Framework for building next generation SPA
PDF
BDD in Java using Cucumber
PPTX
Web Cache Deception Attack
Automated Testing with Google Chrome - WebDriver- ChromeDriver
Do things faster and better with WebAssembly - Sendil Kumar Nellaiyapen - Cod...
How to make your site 5 times faster in 10 minutes
Front-End Web Performance Optimization by BucketSoft
How To Combine Back-End 
 & Front-End Testing with BlazeMeter & Sauce Labs
Magento performancenbs
WordCamp RVA 2011 - Performance & Tuning
Wordcamp2009
UXify 2015 - Front-end Developers' Checklist for Better UX
Universal React apps in Next.js
Metarefresh
Web Performance, Scalability, and Testing Techniques - Boston PHP Meetup
High Performance Web/Mobile Pages - Automation
DeepCrawl Webinar: Performing SEO on the Edge
How to Speed Up Your Joomla! Site
SQL Server - CLR integration
NextJS - Online Summit for Frontend Developers September 2020
NextJS, A JavaScript Framework for building next generation SPA
BDD in Java using Cucumber
Web Cache Deception Attack
Ad

Viewers also liked (6)

PDF
Client-side Performance Testing
PDF
Client-Side Performance Testing
PPTX
Introduction to performance testing
PDF
Client-Side Performance Testing
PPT
Performance Testing
PPTX
Introduction to performance testing
Client-side Performance Testing
Client-Side Performance Testing
Introduction to performance testing
Client-Side Performance Testing
Performance Testing
Introduction to performance testing
Ad

Similar to Client Side Performance @ Xero (20)

PPTX
Building Faster Websites
PDF
DrupalCampLA 2011 - Drupal frontend-optimizing
KEY
Going on an HTTP Diet: Front-End Web Performance
PPT
Web Speed And Scalability
PPT
Oracle UCM: Web Site Performance Tuning
PPT
Web performance - Analysing Heart.co.uk
PPT
High Performance Web Pages - 20 new best practices
PPT
Performance engineering
PPT
performance.ppt
PPT
Csdn Drdobbs Tenni Theurer Yahoo
PDF
High Performance Ajax Applications
PDF
PDF
A little journey into website optimization
PPTX
Joomla! Performance on Steroids
PPTX
AD113 Speed Up Your Applications w/ Nginx and PageSpeed
PDF
Web Client Performance
PPT
Ajax to the Moon
PPT
Frontend performance
PPTX
High-Speed HTML5
KEY
Developing High Performance Web Apps - CodeMash 2011
Building Faster Websites
DrupalCampLA 2011 - Drupal frontend-optimizing
Going on an HTTP Diet: Front-End Web Performance
Web Speed And Scalability
Oracle UCM: Web Site Performance Tuning
Web performance - Analysing Heart.co.uk
High Performance Web Pages - 20 new best practices
Performance engineering
performance.ppt
Csdn Drdobbs Tenni Theurer Yahoo
High Performance Ajax Applications
A little journey into website optimization
Joomla! Performance on Steroids
AD113 Speed Up Your Applications w/ Nginx and PageSpeed
Web Client Performance
Ajax to the Moon
Frontend performance
High-Speed HTML5
Developing High Performance Web Apps - CodeMash 2011

Recently uploaded (20)

PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Approach and Philosophy of On baking technology
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Electronic commerce courselecture one. Pdf
PDF
cuic standard and advanced reporting.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Modernizing your data center with Dell and AMD
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Encapsulation theory and applications.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
A Presentation on Artificial Intelligence
PDF
Chapter 3 Spatial Domain Image Processing.pdf
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Review of recent advances in non-invasive hemoglobin estimation
Approach and Philosophy of On baking technology
The AUB Centre for AI in Media Proposal.docx
Spectral efficient network and resource selection model in 5G networks
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Electronic commerce courselecture one. Pdf
cuic standard and advanced reporting.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
Encapsulation_ Review paper, used for researhc scholars
Modernizing your data center with Dell and AMD
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Machine learning based COVID-19 study performance prediction
Encapsulation theory and applications.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
A Presentation on Artificial Intelligence
Chapter 3 Spatial Domain Image Processing.pdf

Client Side Performance @ Xero

  • 1. Client-Side Performance Sucks Craig Walker, Chief Technology Officer And what you can do to make it suck less. www.xero.com
  • 2. Your typical internal network: Easier to control Easier to predict Knowledge of almost everything from LAN speed to operating system
  • 3. There's a reason why the words “world” and “wide” are in the acronym Control and knowledge are limited to your own environment. Even how the packets fly around the internet is out of your control. www.xero.com
  • 4. The HTTP Request Server Browser Receive Last Byte Send Last Byte Send Data Establish Connection Initial Connection Open Socket Initial HTTP Request First Byte Receive First Byte Send First Byte Content Download ISP Get IP DNS Lookup
  • 5. 5% Server side performance often not the problem with response time 95% Most of the response time is taken up here
  • 8. Focus on the front-end 75-95% of the end-user response time for Xero customers is spent on the front end Much easier to optimise than server side performance Greater potential for improvement – especially from an end-users point-of-view Proven to work
  • 10. The giants who’s shoulders I’m standing on Yahoo! Exceptional Performance team http://developer.yahoo.com/performance/ Steve Souders Former Chief of Performance at Yahoo! Now at Google Creator of YSlow and the 14 Rules Author of High Performance Web Sites Stoyan Stefanov, Patrick Meenan, Julien Lecomte, Stuart Colville, Ed Eliot and many more …
  • 11. Zip It! Significantly reduces download size – 60-80% saving on text based content 90% of browsers support compression Benefits ALL users Zip everything you can html (aspx), js, css, xml, txt, json (ashx, axd) Benefits you too: Reduces traffic costs Doesn’t require code changes
  • 13. Reduce HTTP Requests Less components means a faster page Every request is an overhead Combine scripts Combine CSS Combine images into CSS Sprites Don’t rely on cache: 304’s are still requests
  • 14. CSS Sprites Combine all small images into one large image Use CSS to control the displaying of each image
  • 15. The designers want what? 11 Images 11 HTTP Requests 3.3 KB total size
  • 16. Obey your thirst ® 1 Image 1 HTTP Request 1.6 KB total size
  • 17. And the CSS? <div class=&quot;buttons&quot;> <span class=&quot;large green button&quot;> <button type=&quot;button&quot;> <span class=&quot;checkbox icon&quot;> Approve </span> </button> </span> <span class=&quot;large blue button&quot;> <button type=&quot;button&quot;> <span> Save </span> </button> </span> <span class=&quot;large red button&quot;> <button type=&quot;button&quot;> <span class=&quot;delete icon&quot;> Delete </span> </button> </span> <span class=&quot;medium gray button&quot;> <button type=&quot;button&quot;> <span class=&quot;delete icon&quot;> Cancel </span> </button> </span> </div> .buttons span.button { background:transparent url(buttons.png) no-repeat 0 0; } .buttons span.button button, .buttons span.button a { background:transparent url(buttons.png) no-repeat 100% -120px; } .buttons span.blue { background-position: 0 -30px; } .buttons span.blue button, .buttons span.blue a { background-position: 100% -150px; } .buttons span.red { background-position: 0 -60px; } .buttons span.red button, .buttons span.red a { background-position: 100% -180px; } .buttons span.green { background-position: 0 -90px; } .buttons span.green button, .buttons span.green a { background-position: 100% -210px; } The HTML The CSS
  • 18. Maximise Parallel Downloads Most browsers are limited to 6 connections total and 2 connections per hostname Increase the number of hostnames to increase the number of parallel downloads (e.g., go.xero.com, gos1.xero.com, gos2.xero.com) Don’t overdo it! (DNS lookups are expensive so limit 2-4 domains) Browser Parallel Downloads Firefox 2 2 Firefox 3 6 Internet Explorer 7 2 Internet Explorer 8 6 Safari 3.1 4 Safari 4.0 4
  • 19. Maximise Parallel Downloads Stepped download (with 1 hostname) Increased parallelism (using 2 hostnames)
  • 20. Use a CDN Content Delivery Network Distributes content closer to the last mile Distribute your static content before distributing your dynamic content Akamai most popular but very expensive Xero utilises a rudimentary CDN using IP lookup to determine location
  • 21. How it works: Images JS CSS <xsl:value-of select=&quot;Page:RegisterCSS('/common/style/xero.css','screen')&quot;/> <xsl:value-of select=&quot;Page:RegisterJavascript('/common/scripts/xero.js'&quot;/> <link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; href=&quot;https://nzs1.xero.com/common/style/xero.css&quot; /> <script type=&quot;text/javascript&quot; src=&quot;https://nzs2.xero.com/common/scripts/xero.js&quot;></script> GET Request Response with HTML document Get location from IP
  • 22. Maximise the cache Understand the ratio of cached vs uncached Add an Expires header Not just for images – should be used on all static content Set a “Never expire” or far future expires policy if you can Reduces HTTP requests – once component is served, the browser never asks for it again Date stamping in file names makes it easier Remove ETags ETags are another caching mechanism – sent with every request Uniquely created per web server – not good in web farms Just turn them off and use Expires headers instead
  • 23. CSS external and on top Move all inline CSS to external style sheets for both reuse and caching Put all style sheet references at the top Firefox and IE will block rendering until all the CSS is downloaded Use <link> and NOT @import In IE @import is the same as putting <link> at the bottom
  • 24. JavaScript external and on the bottom Move scripts to external files for both reuse and caching Promotes better script design Push scripts as low as possible Often difficult with document.write or with inline calls requiring loaded JavaScript Be pragmatic – think about splitting JavaScript into “must be loaded” and “can be loaded on demand” Scripts will block both downloading and rendering until parsed Remove duplicate scripts (IE has a habit of downloading them again)
  • 25. Notice the parallel download here … … until we hit the JavaScript files where they come down sequentially, blocking any other downloads
  • 26. Minify all static content CSS, JavaScript, XML, JSON, HTML can all be minified Not a replacement for gzipping but is a perfect accompaniment to it Lots of tools: JSMin CSSTidy YUI Compressor JavaScript obfuscation can also be useful – just test that your app still works afterwards
  • 27. Optimise images Use PNGs instead of GIFs Avoid alpha filters – can block rendering and freeze the browser PNG8 is best and supported by IE6 (yes – even with transparency) Optimise further with PNGOUT or PNGCRUSH Make sure you have a favicon.ico Every browser will request it Best not to respond with a 404 Make it small and cacheable
  • 28. Preloading … Preload components you’ll need in the future Unconditional preload Xero login page preloads all core components so that the dashboard experience is better Conditional preload Often based on where you think a user might go to next
  • 29. Reduce cookie weight Cookie’s are sent back with every request Keep cookie size small and only store what’s required – use server-side storage for everything else Consider cookie free domains for static content
  • 30. Keep it clean Choose a good Ajax library – don’t go writing this stuff yourself Always asynchronous Use JSON over XML Accessing JSON faster and cheaper Less overhead than XML Use GET requests over POSTs wherever possible POST is a 2-step process: send headers, send body POST without a body is essentially a GET anyway And make sure the response is zipped!
  • 31. Things to take away Focus on the front-end Be an advocate for your users Don’t let designers get in the way of performance But they will so optimise, optimise, optimise!
  • 32. YSlow Firebug extension Grades performance – not about response times but about how well a site has adopted the techniques suggested Response time inversely proportional to YSlow score – get as close to an A as possible to get the maximum performance gain
  • 33. Fiddler Microsoft built HTTP debugging proxy Inspect HTTP traffic, tamper with incoming and outgoing data and debug performance issues Works with all browsers
  • 34. AOL PageTest Internal AOL utility gone public Browser plug-in for Internet Explorer Visually displays underlying requests and provides suggestions on how to improve your response times Also available as an external web-based tester at www.webpagetest.org