SlideShare a Scribd company logo
Optimization of
modern web apps

     Eugene Lazutkin

   ClubAjax on 8/7/2012
       Dallas, TX
About me
• Eugene Lazutkin
• Open Source web developer
   • Majors: JavaScript & Python, Dojo & Django.
• Independent consultant
• Blog: lazutkin.com
• Twitter: @uhop, Google+: gplus.to/uhop
What’s new?
Browser landscape has
      changed
What else is new?

• We are transitioning from static web applications
  with JavaScript helpers to dynamic web
  applications.
   • One-page web applications.
   • Interactive grids, charts, CRUD.
   • Multimedia is on its way.
The waterfall
Important things
• Individual web requests.
• Event: DOMContentLoaded
   • DOM is fully parsed, but not laid out yet.
• Event: load
   • All external assets are loaded.
   • DOM geometry is calculated.
When can we use it?

• After DOMContentLoaded.
• After load.
• Sometimes between them.
   • Example: our app works, yet some images are
     being downloaded.
Problem: batching

• A network diagram frequently looks like a staircase.
• Requests are batched.
• Browser limits connections per host.
   • Usually 2-8 connections depending on browser
     and on HTTP version (1.0 or 1.1).
   • Prevents server overload.
Problem: bandwidth


• We need to download a lot of resources.
• Slow connections limit the app.
• The less we download, the better.
Anatomy of connection
• Lifecycle (add browser delays, and network latency
  liberally):
   1.Client does a DNS lookup (complex operation).
   2.Client sends a request (data, headers, cookies).
   3.Server gets it, processes it, and sends a
     response.
   4.Client receives and processes it.
Problem: connections


• Connections are expensive.
• We should reduce their number.
Solution: batching

• Sharding:
   • Serve different resources from different hosts.
• Pro: if batching is a bottleneck, that can help
  considerably.
• Con: more expensive DNS lookups.
CDN
• Can help with batching and bandwidth at the same
  time.
• Can reduce latency for geographically distributed
  clients.
• The same problems as sharding.
• You should factor in CDN service costs (usually
  inexpensive).
Solution: bandwidth
• Let’s compress all we can.
   • Images can be compressed lossy or losslessly.
   • Text (JavaScript, CSS, HTML) should be
     gzipped.
      • It can be preprocessed (minified) to be even
        more compressible.
• Use static compression whenever you can.
Solution: bandwidth

• If we bundle similar resources together usually we
  can compress them better.
   • Merge all JavaScript.
   • Merge all CSS.
   • Use sprites instead of separate images.
• Bundling conserves connections too!
Solution: bandwidth

• It makes sense to remove all inlined JavaScript
  (<script> blocks, event handlers), and CSS
  (<style> blocks) from HTML.
• Images should be converted to sprites.
   • Example: <img> can be represented as <div>
     with a proper background image.
What I use

• Both Dojo and RequireJS come with a build tool.
   • It bundles, and minifies JavaScript.
   • It bundles and minifies CSS.
• SmartSprites (http://csssprites.org)
   • It can handle vertically and horizontally tiled,
     and untiled images.
Problems with
           bundling

• 3rd party resources cannot be bundled easily.
• Bundled resources should have the same
  expiration.
• Dynamic data cannot be easily bundled.
Solution: connections


• We bundled all we could. Now what?
• Now it is time to go back to basics: network
  protocols starting with TCP/IP.
Really???
Oh, yes!

• The standard-compliant server sends 3 (three)
  packages and waits for ACK.
   • It is a part of congestion-controlling algorithm.
• What does it mean for us?
   • Client gets 3 packages relatively fast.
   • Useful payload is just over 1.5k.
TCP 3 packets rule

• How can we use it?
   • If we send an HTML page, try to fit all
     external resource requests in the first 1.5k.
   • If you can keep your HTML page under 1.5k
     (compressed) — awesome!
HTTP rules!

• HTTP/1.0 creates one connection per request.
   • Expensive.
• HTTP/1.1 allows to reuse the same connection to
  request different resources from the same host.
   • Double check that you use HTTP/1.1 on
     server.
HTTP pipelining
HTTP pipelining
• Part of HTTP/1.1.
• Allows to request several resources without waiting
  for response.
• Resources should come in the order of their
  requests.
• Frequently turned off.
• Improves high-latency/mobile scenarios.
SPDY

• Introduced by Google.
• Will likely be a part of HTTP/2.0.
• Allows asynchronous requests/responses over a
  single connection.
• Allows server push and server hint.
Who supports SPDY?

• Implemented by Chrome/Chromium and Firefox.
• Used by Google, Twitter.
• Announced by Facebook.
• Implemented by most vendors including Apache,
  nginx (experimental), most app servers like node.js.
• Server push and hint are rarely implemented.
Ideal web app
<!doctype html>
<html>
     <head>
        <link rel=”stylesheet” type=”text/css” href=”x.css”>
        <!— images are requested from CSS as one sprite —>
        <script src=”x.js”></script>
     </head>
     <body>
        <!— HTML here may be dynamically generated —>
     </body>
</html>


                          Now what?
Where to include JS?
• Most gurus recommend to include it in a body as a
  last node.
• That’s incorrect in general!
• It works only for “gradual enhancements” scripts.
   • Scripts, which provide convenience, not main
     functionality.
      • Error checking, calendars, and so on.
Where to include JS?

• It is unwise to make it last, if our app functionality
  depends on it.
    • It renders significant parts of out web page.
    • It requests data from a server.
    • It is the application.
• In our “ideal app” it doesn’t matter where to put it.
Can we reduce it more?
• We can inline CSS and JavaScript back.
• Images can be inlined too using “data:” URI.
• Cons:
   • Usually it violates “the same expiration” rule.
   • Prevents reuse between pages.
   • “data:” URI can increase a file size.
Problem: dynamic data
• We optimized the web app. Now what?
• Usually the dynamic data requests stick out like a
  sore thumb.
   • Unlike static files, such requests do take some
     server processing:
      • SQL queries, disk I/O, internal network
        services.
Solution: dynamic data

• We can try to consolidate several requests required
  to render a page into one request.
• We can request this data first thing.
   • Literally.
   • Both XHR and <script> can be used but I
     prefer scripts with JSONP.
Data-first idea part 1

• Let’s request the data first, if it takes a long time.
• In order to be efficient we cannot rely on any other
  JavaScript libraries.
• It will be loaded in parallel with the rest.
    • Con: it will occupy a connection slot.
• The result would be stored in a variable.
Data-first idea part 2

• When our main JS is loaded we can check that
  variable.
   • If it is populated, we can wait until DOM is
     ready to render data.
   • Otherwise we can override our JSONP callback
     function, and wait for data, and for DOM.
Data-first sketch
<!doctype html>
<html>
     <head>
        <script>
           function __load(data){...}
           var t = document.createElement("script");
           t.src = "/api?timeout=2&callback=__load";
           document.documentElement.appendChild(t);
        </script>
        <link...>
        <script...>
     </head>
     <body>
        <!— HTML, if any —>
Cache considerations


• If we expect our user to come again, or
• If we expect it to use other pages of our web app.
• We have to work with cache.
Server-side headers
• Determine expirations of your resources and set all
  proper HTTP headers:
   • Expires, Last-Modified, Cache-Control
   • If set properly, browser would not even attempt
     to connect within their expiration period.
• Set ETag header.
   • Sometimes timestamp is not reliable.
Server-side headers
• Proper settings reduce number of connections.
• It allows server to send 304 (not modified) response
  instead of a potentially big resource.
• Don’t forget that some companies and ISPs run
  intermediate caches.
• Read http://lazutkin.com/blog/2007/feb/1/
  improving-performance/ for more details.
Prime cache
• Sometimes it makes sense to load files not used by
  this web page, which can be used by other pages.
• Usually it is done asynchronously several seconds
  later after the page has started.
   • Invisible image can be created.
   • CSS and JS can be linked.
     • They should not interfere with the page!
Or use manifest

• Part of HTML5 to facilitate offline applications.
• A text file that lists what should be downloaded and
  placed into a permanent cache, network URLs,
  and fallback URLs.
• Should be served as “text/cache-manifest”.
• Supported by FF, Cr, Opera, Safari, IE10.
Cache manifest
            example
<!doctype html>
<html manifest=”cache.manifest”>
     ...

  <!— cache.manifest example content —>
  CACHE MANIFEST
  /y.js
  /y.css
  /y.jpg
  /y.html
  ...
Tools of trade

• Built-in debuggers of modern browsers.
   • Firebug.
• Network sniffers.
   • HTTPWatch, Fiddler.
• And...
Navigation timing


• For your debugging pleasure you can use
  Navigation Timing API.
• A lot of resource-specific timing information!
• Supported by FF, Cr, IE9.
That’s all
  folks!
Picture credits


pie: http://en.wikipedia.org/wiki/File:Wikimedia_browser_share_pie_chart_3.png
really: http://www.flickr.com/photos/zpeckler/3093588439/
http pipelining: http://en.wikipedia.org/wiki/File:HTTP_pipelining2.svg

More Related Content

What's hot (20)

PPT
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
Sencha
 
PPT
Synapseindia dot net development web applications with ajax
Synapseindiappsdevelopment
 
PPTX
Catch 22: FLex APps
Yash Mody
 
PPTX
SenchaCon 2016: The Modern Toolchain - Ross Gerbasi
Sencha
 
PDF
Best Practices for WordPress
Taylor Lovett
 
PPTX
Searching for the framework of my dreams in node.js ecosystem by Mykyta Semen...
Binary Studio
 
PDF
Modernizing WordPress Search with Elasticsearch
Taylor Lovett
 
PDF
Adobe AEM CQ5 - Developer Introduction
Yash Mody
 
PDF
JavaScript Service Worker Design Patterns for Better User Experience
reeder29
 
PDF
You Got React.js in My PHP
Taylor Lovett
 
PDF
Adobe AEM for Business Heads
Yash Mody
 
ZIP
Drupal, Android and iPhone
Alexandru Badiu
 
PPT
Real World Rails Deployment
Alan Hecht
 
PPT
Krug Fat Client
Paul Klipp
 
PDF
Meanstack Introduction by Kishore Chandra
Kishore Chandra
 
PDF
Angular - Chapter 7 - HTTP Services
WebStackAcademy
 
PDF
Basic Understanding and Implement of Node.js
Gary Yeh
 
PPT
Node and Azure
Jason Gerard
 
PPTX
Microservices with Apache Camel, Docker and Fabric8 v2
Christian Posta
 
PPTX
Java script
19TUIT038KAVIARASUM
 
SenchaCon 2016: LinkRest - Modern RESTful API Framework for Ext JS Apps - Rou...
Sencha
 
Synapseindia dot net development web applications with ajax
Synapseindiappsdevelopment
 
Catch 22: FLex APps
Yash Mody
 
SenchaCon 2016: The Modern Toolchain - Ross Gerbasi
Sencha
 
Best Practices for WordPress
Taylor Lovett
 
Searching for the framework of my dreams in node.js ecosystem by Mykyta Semen...
Binary Studio
 
Modernizing WordPress Search with Elasticsearch
Taylor Lovett
 
Adobe AEM CQ5 - Developer Introduction
Yash Mody
 
JavaScript Service Worker Design Patterns for Better User Experience
reeder29
 
You Got React.js in My PHP
Taylor Lovett
 
Adobe AEM for Business Heads
Yash Mody
 
Drupal, Android and iPhone
Alexandru Badiu
 
Real World Rails Deployment
Alan Hecht
 
Krug Fat Client
Paul Klipp
 
Meanstack Introduction by Kishore Chandra
Kishore Chandra
 
Angular - Chapter 7 - HTTP Services
WebStackAcademy
 
Basic Understanding and Implement of Node.js
Gary Yeh
 
Node and Azure
Jason Gerard
 
Microservices with Apache Camel, Docker and Fabric8 v2
Christian Posta
 
Java script
19TUIT038KAVIARASUM
 

Similar to Optimization of modern web applications (20)

PDF
Are Today’s Good Practices… Tomorrow’s Performance Anti-Patterns?
Andy Davies
 
PDF
Even faster web sites 1st Edition Steve Souders
huapepotts09
 
PDF
Performance on the Yahoo! Homepage
Nicholas Zakas
 
PDF
Building performance into the new yahoo homepage presentation
masudakram
 
ODP
Web program-peformance-optimization
xiaojueqq12345
 
PPTX
Presentation Tier optimizations
Anup Hariharan Nair
 
KEY
Developing High Performance Web Apps - CodeMash 2011
Timothy Fisher
 
PDF
Web performance optimization - MercadoLibre
Pablo Moretti
 
PDF
Web performance mercadolibre - ECI 2013
Santiago Aimetta
 
PPTX
Building Lightning Fast Websites (for Twin Cities .NET User Group)
strommen
 
PDF
Ten practical ways to improve front-end performance
Andrew Rota
 
PDF
From nothing to a video under 2 seconds / Mikhail Sychev (YouTube)
Ontico
 
PDF
High Performance JavaScript Build Faster Web Application Interfaces 1st Editi...
yarecofuxxa58
 
PPTX
JS digest. July 2018
ElifTech
 
PDF
Practical Performance Tips and Tricks to Make Your HTML/JavaScript Apps Faster
Doris Chen
 
PDF
The Mobile Web - HTML5 on mobile devices
Wesley Hales
 
PDF
Don't make me wait! or Building High-Performance Web Applications
Stoyan Stefanov
 
KEY
A rough guide to JavaScript Performance
allmarkedup
 
PPTX
Building high performance web apps.
Arshak Movsisyan
 
PPT
Sanjeev ghai 12
Praveen kumar
 
Are Today’s Good Practices… Tomorrow’s Performance Anti-Patterns?
Andy Davies
 
Even faster web sites 1st Edition Steve Souders
huapepotts09
 
Performance on the Yahoo! Homepage
Nicholas Zakas
 
Building performance into the new yahoo homepage presentation
masudakram
 
Web program-peformance-optimization
xiaojueqq12345
 
Presentation Tier optimizations
Anup Hariharan Nair
 
Developing High Performance Web Apps - CodeMash 2011
Timothy Fisher
 
Web performance optimization - MercadoLibre
Pablo Moretti
 
Web performance mercadolibre - ECI 2013
Santiago Aimetta
 
Building Lightning Fast Websites (for Twin Cities .NET User Group)
strommen
 
Ten practical ways to improve front-end performance
Andrew Rota
 
From nothing to a video under 2 seconds / Mikhail Sychev (YouTube)
Ontico
 
High Performance JavaScript Build Faster Web Application Interfaces 1st Editi...
yarecofuxxa58
 
JS digest. July 2018
ElifTech
 
Practical Performance Tips and Tricks to Make Your HTML/JavaScript Apps Faster
Doris Chen
 
The Mobile Web - HTML5 on mobile devices
Wesley Hales
 
Don't make me wait! or Building High-Performance Web Applications
Stoyan Stefanov
 
A rough guide to JavaScript Performance
allmarkedup
 
Building high performance web apps.
Arshak Movsisyan
 
Sanjeev ghai 12
Praveen kumar
 
Ad

More from Eugene Lazutkin (19)

PDF
Service workers
Eugene Lazutkin
 
PDF
Advanced I/O in browser
Eugene Lazutkin
 
PDF
Streams
Eugene Lazutkin
 
PDF
Functional practices in JavaScript
Eugene Lazutkin
 
PDF
Express: the web server for node.js
Eugene Lazutkin
 
PDF
TXJS 2013 in 10 minutes
Eugene Lazutkin
 
PDF
Practical pairing of generative programming with functional programming.
Eugene Lazutkin
 
KEY
OOP in JS
Eugene Lazutkin
 
KEY
Pulsar
Eugene Lazutkin
 
KEY
SSJS, NoSQL, GAE and AppengineJS
Eugene Lazutkin
 
KEY
Dojo for programmers (TXJS 2010)
Eugene Lazutkin
 
KEY
RAD CRUD
Eugene Lazutkin
 
KEY
Exciting JavaScript - Part I
Eugene Lazutkin
 
PPT
CRUD with Dojo
Eugene Lazutkin
 
KEY
Dojo GFX workshop slides
Eugene Lazutkin
 
KEY
Dojo GFX: SVG in the real world
Eugene Lazutkin
 
PDF
Dojo (QCon 2007 Slides)
Eugene Lazutkin
 
PDF
DojoX GFX Session Eugene Lazutkin SVG Open 2007
Eugene Lazutkin
 
PDF
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
Eugene Lazutkin
 
Service workers
Eugene Lazutkin
 
Advanced I/O in browser
Eugene Lazutkin
 
Functional practices in JavaScript
Eugene Lazutkin
 
Express: the web server for node.js
Eugene Lazutkin
 
TXJS 2013 in 10 minutes
Eugene Lazutkin
 
Practical pairing of generative programming with functional programming.
Eugene Lazutkin
 
OOP in JS
Eugene Lazutkin
 
SSJS, NoSQL, GAE and AppengineJS
Eugene Lazutkin
 
Dojo for programmers (TXJS 2010)
Eugene Lazutkin
 
RAD CRUD
Eugene Lazutkin
 
Exciting JavaScript - Part I
Eugene Lazutkin
 
CRUD with Dojo
Eugene Lazutkin
 
Dojo GFX workshop slides
Eugene Lazutkin
 
Dojo GFX: SVG in the real world
Eugene Lazutkin
 
Dojo (QCon 2007 Slides)
Eugene Lazutkin
 
DojoX GFX Session Eugene Lazutkin SVG Open 2007
Eugene Lazutkin
 
DojoX GFX Keynote Eugene Lazutkin SVG Open 2007
Eugene Lazutkin
 
Ad

Recently uploaded (20)

PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PDF
Python basic programing language for automation
DanialHabibi2
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PDF
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Python basic programing language for automation
DanialHabibi2
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 

Optimization of modern web applications

  • 1. Optimization of modern web apps Eugene Lazutkin ClubAjax on 8/7/2012 Dallas, TX
  • 2. About me • Eugene Lazutkin • Open Source web developer • Majors: JavaScript & Python, Dojo & Django. • Independent consultant • Blog: lazutkin.com • Twitter: @uhop, Google+: gplus.to/uhop
  • 4. What else is new? • We are transitioning from static web applications with JavaScript helpers to dynamic web applications. • One-page web applications. • Interactive grids, charts, CRUD. • Multimedia is on its way.
  • 6. Important things • Individual web requests. • Event: DOMContentLoaded • DOM is fully parsed, but not laid out yet. • Event: load • All external assets are loaded. • DOM geometry is calculated.
  • 7. When can we use it? • After DOMContentLoaded. • After load. • Sometimes between them. • Example: our app works, yet some images are being downloaded.
  • 8. Problem: batching • A network diagram frequently looks like a staircase. • Requests are batched. • Browser limits connections per host. • Usually 2-8 connections depending on browser and on HTTP version (1.0 or 1.1). • Prevents server overload.
  • 9. Problem: bandwidth • We need to download a lot of resources. • Slow connections limit the app. • The less we download, the better.
  • 10. Anatomy of connection • Lifecycle (add browser delays, and network latency liberally): 1.Client does a DNS lookup (complex operation). 2.Client sends a request (data, headers, cookies). 3.Server gets it, processes it, and sends a response. 4.Client receives and processes it.
  • 11. Problem: connections • Connections are expensive. • We should reduce their number.
  • 12. Solution: batching • Sharding: • Serve different resources from different hosts. • Pro: if batching is a bottleneck, that can help considerably. • Con: more expensive DNS lookups.
  • 13. CDN • Can help with batching and bandwidth at the same time. • Can reduce latency for geographically distributed clients. • The same problems as sharding. • You should factor in CDN service costs (usually inexpensive).
  • 14. Solution: bandwidth • Let’s compress all we can. • Images can be compressed lossy or losslessly. • Text (JavaScript, CSS, HTML) should be gzipped. • It can be preprocessed (minified) to be even more compressible. • Use static compression whenever you can.
  • 15. Solution: bandwidth • If we bundle similar resources together usually we can compress them better. • Merge all JavaScript. • Merge all CSS. • Use sprites instead of separate images. • Bundling conserves connections too!
  • 16. Solution: bandwidth • It makes sense to remove all inlined JavaScript (<script> blocks, event handlers), and CSS (<style> blocks) from HTML. • Images should be converted to sprites. • Example: <img> can be represented as <div> with a proper background image.
  • 17. What I use • Both Dojo and RequireJS come with a build tool. • It bundles, and minifies JavaScript. • It bundles and minifies CSS. • SmartSprites (http://csssprites.org) • It can handle vertically and horizontally tiled, and untiled images.
  • 18. Problems with bundling • 3rd party resources cannot be bundled easily. • Bundled resources should have the same expiration. • Dynamic data cannot be easily bundled.
  • 19. Solution: connections • We bundled all we could. Now what? • Now it is time to go back to basics: network protocols starting with TCP/IP.
  • 21. Oh, yes! • The standard-compliant server sends 3 (three) packages and waits for ACK. • It is a part of congestion-controlling algorithm. • What does it mean for us? • Client gets 3 packages relatively fast. • Useful payload is just over 1.5k.
  • 22. TCP 3 packets rule • How can we use it? • If we send an HTML page, try to fit all external resource requests in the first 1.5k. • If you can keep your HTML page under 1.5k (compressed) — awesome!
  • 23. HTTP rules! • HTTP/1.0 creates one connection per request. • Expensive. • HTTP/1.1 allows to reuse the same connection to request different resources from the same host. • Double check that you use HTTP/1.1 on server.
  • 25. HTTP pipelining • Part of HTTP/1.1. • Allows to request several resources without waiting for response. • Resources should come in the order of their requests. • Frequently turned off. • Improves high-latency/mobile scenarios.
  • 26. SPDY • Introduced by Google. • Will likely be a part of HTTP/2.0. • Allows asynchronous requests/responses over a single connection. • Allows server push and server hint.
  • 27. Who supports SPDY? • Implemented by Chrome/Chromium and Firefox. • Used by Google, Twitter. • Announced by Facebook. • Implemented by most vendors including Apache, nginx (experimental), most app servers like node.js. • Server push and hint are rarely implemented.
  • 28. Ideal web app <!doctype html> <html> <head> <link rel=”stylesheet” type=”text/css” href=”x.css”> <!— images are requested from CSS as one sprite —> <script src=”x.js”></script> </head> <body> <!— HTML here may be dynamically generated —> </body> </html> Now what?
  • 29. Where to include JS? • Most gurus recommend to include it in a body as a last node. • That’s incorrect in general! • It works only for “gradual enhancements” scripts. • Scripts, which provide convenience, not main functionality. • Error checking, calendars, and so on.
  • 30. Where to include JS? • It is unwise to make it last, if our app functionality depends on it. • It renders significant parts of out web page. • It requests data from a server. • It is the application. • In our “ideal app” it doesn’t matter where to put it.
  • 31. Can we reduce it more? • We can inline CSS and JavaScript back. • Images can be inlined too using “data:” URI. • Cons: • Usually it violates “the same expiration” rule. • Prevents reuse between pages. • “data:” URI can increase a file size.
  • 32. Problem: dynamic data • We optimized the web app. Now what? • Usually the dynamic data requests stick out like a sore thumb. • Unlike static files, such requests do take some server processing: • SQL queries, disk I/O, internal network services.
  • 33. Solution: dynamic data • We can try to consolidate several requests required to render a page into one request. • We can request this data first thing. • Literally. • Both XHR and <script> can be used but I prefer scripts with JSONP.
  • 34. Data-first idea part 1 • Let’s request the data first, if it takes a long time. • In order to be efficient we cannot rely on any other JavaScript libraries. • It will be loaded in parallel with the rest. • Con: it will occupy a connection slot. • The result would be stored in a variable.
  • 35. Data-first idea part 2 • When our main JS is loaded we can check that variable. • If it is populated, we can wait until DOM is ready to render data. • Otherwise we can override our JSONP callback function, and wait for data, and for DOM.
  • 36. Data-first sketch <!doctype html> <html> <head> <script> function __load(data){...} var t = document.createElement("script"); t.src = "/api?timeout=2&callback=__load"; document.documentElement.appendChild(t); </script> <link...> <script...> </head> <body> <!— HTML, if any —>
  • 37. Cache considerations • If we expect our user to come again, or • If we expect it to use other pages of our web app. • We have to work with cache.
  • 38. Server-side headers • Determine expirations of your resources and set all proper HTTP headers: • Expires, Last-Modified, Cache-Control • If set properly, browser would not even attempt to connect within their expiration period. • Set ETag header. • Sometimes timestamp is not reliable.
  • 39. Server-side headers • Proper settings reduce number of connections. • It allows server to send 304 (not modified) response instead of a potentially big resource. • Don’t forget that some companies and ISPs run intermediate caches. • Read http://lazutkin.com/blog/2007/feb/1/ improving-performance/ for more details.
  • 40. Prime cache • Sometimes it makes sense to load files not used by this web page, which can be used by other pages. • Usually it is done asynchronously several seconds later after the page has started. • Invisible image can be created. • CSS and JS can be linked. • They should not interfere with the page!
  • 41. Or use manifest • Part of HTML5 to facilitate offline applications. • A text file that lists what should be downloaded and placed into a permanent cache, network URLs, and fallback URLs. • Should be served as “text/cache-manifest”. • Supported by FF, Cr, Opera, Safari, IE10.
  • 42. Cache manifest example <!doctype html> <html manifest=”cache.manifest”> ... <!— cache.manifest example content —> CACHE MANIFEST /y.js /y.css /y.jpg /y.html ...
  • 43. Tools of trade • Built-in debuggers of modern browsers. • Firebug. • Network sniffers. • HTTPWatch, Fiddler. • And...
  • 44. Navigation timing • For your debugging pleasure you can use Navigation Timing API. • A lot of resource-specific timing information! • Supported by FF, Cr, IE9.
  • 45. That’s all folks!

Editor's Notes