BUILDING FOR
@andyhume
SmashingConf, New York, 2014
PERFORMANCE
RESILIENCE
Tuesday, June 17, 14
Slide 2
Slide 2 text
WHY CARE?
http://www.strangeloopnetworks.com/resources/infographics/web-performance-and-ecommerce/
Tuesday, June 17, 14
Slide 3
Slide 3 text
WHY CARE?
http://www.strangeloopnetworks.com/resources/infographics/web-performance-and-ecommerce/
Tuesday, June 17, 14
Slide 4
Slide 4 text
WHY CARE?
http://www.strangeloopnetworks.com/resources/infographics/web-performance-and-ecommerce/
Tuesday, June 17, 14
Slide 5
Slide 5 text
WHY CARE?
http://www.strangeloopnetworks.com/resources/infographics/web-performance-and-ecommerce/
Tuesday, June 17, 14
Slide 6
Slide 6 text
WHY CARE?
http://www.strangeloopnetworks.com/resources/infographics/web-performance-and-ecommerce/
Tuesday, June 17, 14
Slide 7
Slide 7 text
WHY CARE?
http://www.strangeloopnetworks.com/resources/infographics/web-performance-and-ecommerce/
Tuesday, June 17, 14
Slide 8
Slide 8 text
Measure
http://www.flickr.com/photos/kayaker1204/4319542459/
Tuesday, June 17, 14
Slide 9
Slide 9 text
Measure
http://www.flickr.com/photos/kayaker1204/4319542459/
We have a median page load me of seven seconds, and our
primary compe tor has a median page load me of three
seconds.
Tell a story
Tuesday, June 17, 14
Slide 10
Slide 10 text
Measure
http://www.flickr.com/photos/kayaker1204/4319542459/
Page load mes increased by 25% when we added feature x.
Tell a story
Tuesday, June 17, 14
Slide 11
Slide 11 text
Your bosses love a story
http://www.flickr.com/photos/kayaker1204/4319542459/
Tuesday, June 17, 14
Slide 12
Slide 12 text
Spread the word
http://www.flickr.com/photos/kayaker1204/4319542459/
Tuesday, June 17, 14
Slide 13
Slide 13 text
What numbers?!
http://www.flickr.com/photos/kayaker1204/4319542459/
Tuesday, June 17, 14
Slide 14
Slide 14 text
What numbers?!
http://www.flickr.com/photos/kayaker1204/4319542459/
Page load time?
Total download size?
Start render time?
Time to first byte?
Response time?
Total HTTP requests?
Document load time?
Tuesday, June 17, 14
Slide 15
Slide 15 text
Tuesday, June 17, 14
Slide 16
Slide 16 text
Tuesday, June 17, 14
Slide 17
Slide 17 text
Tuesday, June 17, 14
Slide 18
Slide 18 text
Tuesday, June 17, 14
Slide 19
Slide 19 text
Tuesday, June 17, 14
Slide 20
Slide 20 text
Tuesday, June 17, 14
Slide 21
Slide 21 text
Tuesday, June 17, 14
Slide 22
Slide 22 text
Load Time First Byte Start Render Fully Loaded Speed Index
FIRST VIEW 3.783s 0.128s 0.676s 6.530s 1522
REPEAT VIEW 2.268s 0.486s 0.486s 3.617s 980
Tuesday, June 17, 14
Slide 23
Slide 23 text
Load Time First Byte Start Render Fully Loaded Speed Index
FIRST VIEW 3.783s 0.128s 0.676s 6.530s 1522
REPEAT VIEW 2.268s 0.486s 0.486s 3.617s 980
Tuesday, June 17, 14
Slide 24
Slide 24 text
Load Time First Byte Start Render Fully Loaded Speed Index
FIRST VIEW 3.783s 0.128s 0.676s 6.530s 1522
REPEAT VIEW 2.268s 0.486s 0.486s 3.617s 980
Tuesday, June 17, 14
Slide 25
Slide 25 text
Measure and tracking trends
http://www.flickr.com/photos/kayaker1204/4319542459/
Tuesday, June 17, 14
Slide 26
Slide 26 text
SpeedCurve
http://speedcurve.com
Tuesday, June 17, 14
Slide 27
Slide 27 text
SpeedCurve
http://speedcurve.com
Tuesday, June 17, 14
Slide 28
Slide 28 text
How to optimize
http://www.flickr.com/photos/freefoto/2231356418/
Tuesday, June 17, 14
Slide 29
Slide 29 text
Web performance 101
http://www.flickr.com/photos/freefoto/2231356418/
Content-Encoding: gzip
Cache-Control: max-age=315360000
Tuesday, June 17, 14
Slide 30
Slide 30 text
Optimizing: First byte
http://www.flickr.com/photos/freefoto/2231356418/
Load Time First Byte Start Render Fully Loaded Speed Index
FIRST VIEW 3.783s 0.128s 0.676s 6.530s 1522
REPEAT VIEW 2.268s 0.486s 0.486s 3.617s 980
Tuesday, June 17, 14
Slide 31
Slide 31 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
Tuesday, June 17, 14
Slide 32
Slide 32 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
Tuesday, June 17, 14
Slide 33
Slide 33 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
Tuesday, June 17, 14
Slide 34
Slide 34 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
Tuesday, June 17, 14
Slide 35
Slide 35 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
SSL Handshake
Tuesday, June 17, 14
Slide 36
Slide 36 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
HTTP Redirect
SSL Handshake
Tuesday, June 17, 14
Slide 37
Slide 37 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
HTTP Redirect
SSL Handshake
Tuesday, June 17, 14
Slide 38
Slide 38 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
HTTP Redirect
SSL Handshake
Tuesday, June 17, 14
Slide 39
Slide 39 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
HTTP Redirect
SSL Handshake
Tuesday, June 17, 14
Slide 40
Slide 40 text
Optimizing: First byte
DNS lookup TCP connect HTTP request Server time HTTP resp
HTTP Redirect
SSL Handshake
Tuesday, June 17, 14
Slide 41
Slide 41 text
Eliminate redirects
Just eleminate redirects
Flush the document early?
Prefetch DNS?
But really, just eleminate redirects
Optimizing: First byte
Tuesday, June 17, 14
Slide 42
Slide 42 text
Optimizing: Start render
http://www.flickr.com/photos/freefoto/2231356418/
Load Time First Byte Start Render Fully Loaded Speed Index
FIRST VIEW 3.783s 0.128s 0.676s 6.530s 1522
REPEAT VIEW 2.268s 0.486s 0.486s 3.617s 980
Tuesday, June 17, 14
Slide 43
Slide 43 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 44
Slide 44 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 45
Slide 45 text
Remote JS
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 46
Slide 46 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 47
Slide 47 text
inline script
waiting on
remote CSS
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 48
Slide 48 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 49
Slide 49 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 50
Slide 50 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
fetching
remote
stylesheets
Tuesday, June 17, 14
Slide 51
Slide 51 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 52
Slide 52 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 53
Slide 53 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 54
Slide 54 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
Tuesday, June 17, 14
Slide 55
Slide 55 text
Avoid blocking scripts
Optimizing: Start render
Tuesday, June 17, 14
Slide 56
Slide 56 text
Optimizing: Start render
var script = document.createElement('script');
script.src = "app.js";
document.head.appendChild(script);
Tuesday, June 17, 14
Slide 57
Slide 57 text
Optimizing: Start render
var script = document.createElement('script');
script.src = "app.js";
document.head.appendChild(script);
BREAKS THE PRE-PARSER!
Tuesday, June 17, 14
Slide 58
Slide 58 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
HTML pre-
parser
Tuesday, June 17, 14
Slide 59
Slide 59 text
Remote JS
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
HTML pre-
parser
Tuesday, June 17, 14
Slide 60
Slide 60 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
HTML pre-
parser
Tuesday, June 17, 14
Slide 61
Slide 61 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
HTML pre-
parser
fetching
remote
stylesheets
Tuesday, June 17, 14
Slide 62
Slide 62 text
Optimizing: Start render
HTML parser DOM tree
Layout Paint
Render tree
HTML pre-
parser
Tuesday, June 17, 14
Slide 63
Slide 63 text
Optimizing: Start render
var script = document.createElement('script');
script.src = "app.js";
document.head.appendChild(script);
BREAKS THE PRE-PARSER!
Tuesday, June 17, 14
Slide 64
Slide 64 text
Optimizing: Start render
Tuesday, June 17, 14
Slide 65
Slide 65 text
Avoid blocking scripts
Optimizing: Start render
Move script elements to end of
Or... add async attribute to script elements
Inline critical CSS
Tuesday, June 17, 14
Slide 66
Slide 66 text
Avoid blocking scripts
Optimizing: Start render
Move script elements to end of
Or... add async attribute to script elements
Inline critical CSS
https://github.com/pocketjoso/penthouse
Tuesday, June 17, 14
Slide 67
Slide 67 text
Optimizing: Load time fully loaded
http://www.flickr.com/photos/freefoto/2231356418/
Load Time First Byte Start Render Fully Loaded Speed Index
FIRST VIEW 3.783s 0.128s 0.676s 6.530s 1522
REPEAT VIEW 2.268s 0.486s 0.486s 3.617s 980
Tuesday, June 17, 14