steve souders [email protected] even faster web sites disclaimer: this content does not...

63

Upload: jordan-reilly

Post on 27-Mar-2015

221 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily
Page 2: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

17%

83%

iGoogle, primed cache

the importance of frontend performance

9% 91%

iGoogle, empty cache

Page 3: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

time spent on the frontend

Empty Cache

Primed Cache

www.aol.com 97% 97%

www.ebay.com 95% 81%

www.facebook.com 95% 81%

www.google.com/search

47% 0%

search.live.com/results 67% 0%

www.msn.com 98% 94%

www.myspace.com 98% 98%

en.wikipedia.org/wiki 94% 91%

www.yahoo.com 97% 96%

www.youtube.com 98% 97%April 2008

Page 4: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

The Performance Golden Rule

80-90% of the end-user response time is spent on the frontend. Start there.

greater potential for improvement

simpler

proven to work

Page 5: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily
Page 6: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily
Page 7: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily
Page 8: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Sept 2007

Page 9: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

June 2009

Page 10: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

14 RULES

1. MAKE FEWER HTTP REQUESTS

2. USE A CDN3. ADD AN EXPIRES HEADER4. GZIP COMPONENTS5. PUT STYLESHEETS AT THE

TOP6. PUT SCRIPTS AT THE

BOTTOM7. AVOID CSS EXPRESSIONS8. MAKE JS AND CSS

EXTERNAL9. REDUCE DNS LOOKUPS10.MINIFY JS11.AVOID REDIRECTS12.REMOVE DUPLICATE

SCRIPTS13.CONFIGURE ETAGS14.MAKE AJAX CACHEABLE

Page 11: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Even Faster Web SitesSplitting the initial payloadLoading scripts without blockingCoupling asynchronous scriptsPositioning inline scriptsSharding dominant domainsFlushing the document earlyUsing iframes sparinglySimplifying CSS Selectors

Understanding Ajax performance..........Doug CrockfordCreating responsive web apps............Ben Galbraith, Dion

AlmaerWriting efficient JavaScript.............Nicholas ZakasScaling with Comet.....................Dylan SchiemannGoing beyond gzipping...............Tony GentilcoreOptimizing images...................Stoyan Stefanov, Nicole

Sullivan

Page 12: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

AOLeBayFacebookMySpaceWikipediaYahoo!

Why focus on JavaScript?

YouTube

Page 13: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

scripts block

<script src="A.js"> blocks parallel downloads and rendering

7 secs: IE 8, FF 3.5(?), Chr 2, Saf 4http://stevesouders.com/cuzillion/?ex=10008

What's Cuzillion?

9 secs: IE 6-7, FF 3.0, Chr 1, Op 9-10, Saf 3

Page 14: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

JavaScript

Functions Executed before

onload

www.aol.com 115K 30%

www.ebay.com 183K 44%

www.facebook.com 1088K 9%

www.google.com/search

15K 45%

search.live.com/results

17K 24%

www.msn.com 131K 31%

www.myspace.com 297K 18%

en.wikipedia.org/wiki 114K 32%

www.yahoo.com 321K 13%

www.youtube.com 240K 18%

26% avg252K avg

Splitting the Initial Payload

Page 15: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Splitting the Initial Payload

split your JavaScript between what's needed to render the page and everything else

load "everything else" after the page is rendered

separate manually (Firebug); tools needed to automate this (Doloto from Microsoft)

load scripts without blocking – how?

Page 16: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

MSNScripts and other resources downloaded in parallel! How? Secret sauce?!var p= g.getElementsByTagName("HEAD")[0];var c=g.createElement("script");c.type="text/javascript";c.onreadystatechange=n;c.onerror=c.onload=k;c.src=e;p.appendChild(c)

MSN.com: parallel scripts

Page 17: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Loading Scripts Without Blocking

XHR Eval

XHR Injection

Script in Iframe

Script DOM Element

Script Defer

document.write Script Tag

Page 18: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Script DOM Elementvar se = document.createElement('script');se.src = 'http://anydomain.com/A.js';document.getElementsByTagName('head') [0].appendChild(se);

script and main page domains can differ

no need to refactor JavaScript

http://stevesouders.com/cuzillion/?ex=10010

Page 19: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

browser busy indicators

Page 20: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Loading Scripts Without Blocking

*Only other document.write scripts are downloaded in parallel (in the same script block).

Page 21: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

and the winner is...XHR EvalXHR InjectionScript in iframeScript DOM ElementScript Defer

Script DOM ElementScript Defer

Script DOM Element

Script DOM Element (FF)Script Defer (IE)

XHR EvalXHR InjectionScript in iframeScript DOM Element (IE)

XHR InjectionXHR EvalScript DOM Element (IE)

Managed XHR InjectionManaged XHR EvalScript DOM Element

Managed XHR InjectionManaged XHR Eval

Script DOM Element (FF)Script Defer (IE)Managed XHR EvalManaged XHR Injection

Script DOM Element (FF)Script Defer (IE)Managed XHR EvalManaged XHR Injection

different domains same domains

no order

preserve order

no order

no busyshow busy

show busyno busy

preserve order

Page 22: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily
Page 23: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

asynchronous JS example: menu.js

<script type="text/javascript">var domscript = document.createElement('script');domscript.src = "menu.js"; document.getElementsByTagName('head')

[0].appendChild(domscript);

var aExamples = [ ['couple-normal.php', 'Normal Script Src'], ['couple-xhr-eval.php', 'XHR Eval'], ... ['managed-xhr.php', 'Managed XHR'] ];

function init() { EFWS.Menu.createMenu('examplesbtn', aExamples);}

init();</script>

script DOM element approach

Page 24: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

before

after

Page 25: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Loading Scripts Without Blocking

*Only other document.write scripts are downloaded in parallel (in the same script block).

!IE

Page 26: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

what about

inlined code that depends on the script?

Page 27: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

coupling techniques

hardcoded callback

window onload

timer

degrading script tags

script onload

Page 28: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

technique 5: script onload<script type="text/javascript">var aExamples = [['couple-normal.php', 'Normal Script Src'], ...];

function init() { EFWS.Menu.createMenu('examplesbtn', aExamples);}

var domscript = document.createElement('script');domscript.src = "menu.js";

domscript.onloadDone = false;domscript.onload = function() { if ( ! domscript.onloadDone ) { init(); } domscript.onloadDone = true; };domscript.onreadystatechange = function() { if ( "loaded" === domscript.readyState ) { if ( ! domscript.onloadDone ) { init(); } domscript.onloadDone = true; }}

document.getElementsByTagName('head')[0].appendChild(domscript);</script>

pretty nice, medium complexity

Page 29: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

asynchronous loading & coupling

async technique: Script DOM Elementeasy, cross-browserdoesn't ensure script order

coupling technique: script onloadfairly easy, cross-browserensures execution order for external

script and inlined code

multiple interdependent external and inline scripts:much more complex (see hidden slides)concatenate your external scripts into

one!

Page 30: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

bad: stylesheet followed by inline script

browsers download stylesheets in parallel with other resources that follow...

...unless the stylesheet is followed by an inline script

http://stevesouders.com/cuzillion/?ex=10021

best to move inline scripts above stylesheets or below other resources

use Link, not @import

Page 31: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

eBayMSNMySpaceWikipedia

Positioning Inline Scripts

Page 32: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Sharding Dominant Domains

but Rule 9 says "Reduce DNS lookups"?!remove DNS lookups that aren't heavily

usedsplit domains that are on the critical

path

how find "critical path"?

Page 33: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

www.yahoo.com

Page 34: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

http://news.google.com

news.google.com

Page 35: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

connections per server by browser

newer browsers open more connections*

best to shard across 2-4 domains**

HTTP/1.1 HTTP/1.0IE 6,7 2 4

IE 8 6 6

Firefox 1.5, 2 2 8

Firefox 3 6 6

Safari 3,4 4 4

Chrome 6 6

Opera 9 4 4

* http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/** http://yuiblog.com/blog/2007/04/11/performance-research-part-4/

Page 36: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

flushing the document early

gotchas:PHP output_buffering – ob_flush()Transfer-Encoding: chunkedgzip – Apache's DeflateBufferSize before

2.2.8proxies and anti-virus softwarebrowsers – Safari (1K), Chrome (2K)HTML document blocks resources

other languages: $| or FileHandle autoflush (Perl), flush

(Python), ios.flush (Ruby)

htmlimageimagescript

htmlimageimagescript call PHP's flush()

Page 37: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

successful flushing

Google Search

external resource downloaded earlycontent visible to the user

googleimageimagescriptimage204

http://www.google.com/images/nav_logo4.png

Page 38: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

most expensive DOM element

blocks parent's onload

workaround: set iframe src via setTimeout

Using Iframes Sparingly

<iframe id=if1 src=""></iframe><script type="text/javascript">function setSrc() { document.getElementById('if1').src="url";}setTimeout(setSrc, 0);</script>

Page 39: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

types of CSS selectors

ID selectors: #toc {} class selectors: .chapter {}type selectors: A {}adjacent sibling selectors: H1 + #toc {} child selectors: #toc > LI {}descendant selectors: #toc A {}universal selectors: * {}attribute selectors: href="#index"] {}psuedo classes and elements: A:hover {}

Page 40: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

writing efficient CSS

https://developer.mozilla.org/en/Writing_Efficient_CSS

"The style system matches a rule by starting with the rightmost selector and moving to the left through the rule's selectors. As long as your little subtree continues to check out, the style system will continue moving to the left until it either matches the rule or bails out because of a mismatch."

#toc > LI { font-weight: bold; }find every LI whose parent is id="toc"

#toc A { color: #444; }find every A and climb its ancestors until id="toc" or DOM root (!) is found

Page 41: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

real world levels of CSS#

Rules#

elementsAvg

DepthAOL 2289 1628 13

eBay 305 588 14

Facebook 2882 1966 17

Google Search 92 552 8

Live Search 376 449 12

MSN.com 1038 886 11

MySpace 932 444 9

Wikipedia 795 1333 10

Yahoo! 800 564 13

YouTube 821 817 9

average 1033 923 12

Page 42: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

testing typical CSS

"costly"selectors aren't always costly (at typical levels)

are these selectors "costly"?DIV DIV DIV P A.class0007 { ... }

1K rules (vs. 20K)same amount of CSS

in all test pages30 ms avg delta

http://www.stevesouders.com/blog/2009/03/10/performance-impact-of-css-selectors/

Page 43: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

testing expensive selectors

1K rules (vs. 20K)same amount of CSS

in all test pages2126 ms avg delta!

truly expensive selectorA.class0007 * { ... }

compare to:DIV DIV DIV P A.class0007 { ... }

the key is the key selector – the rightmost argument

Page 44: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Simplifying CSS Selectors

efficient CSS comes at a cost – page weight

focus optimization on selectors where the key selector matches many elements

reduce the number of selectors

Page 45: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Performance Tools

HttpWatch http://www.httpwatch.com/

Firebug http://getfirebug.com/

Page Speed http://code.google.com/speed/page-speed/

YSlow http://developer.yahoo.com/yslow/

Smush.it http://smush.it/

CSS Sprite Generator http://spritegen.website-performance.org/

SpriteMe http://spriteme.org/ (in progress)

Hammerhead http://stevesouders.com/hammerhead/

Cuzillion http://cuzillion.com/

Page 46: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Performance Analyzers: HPWS rules

YSlow

Page Speed

Pagetest VRTA neXpert

combine JS & CSS X X Xuse CSS sprites X Xuse a CDN X Xset Expires in the future

X X X X X

gzip text responses X X X X Xput CSS at the top X Xput JS at the bottom Xavoid CSS expressions X Xmake JS & CSS externalreduce DNS lookups X Xminify JS X X Xavoid redirects X X X Xremove dupe scripts Xremove ETags X X X

Page 47: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Performance Analyzers: EFWS rules

YSlow

Page Speed

Pagetest VRTA neXpert

don't block UI threadsplit JS payload X

load scripts async Xinline JS b4 stylesheet X

write efficient JSmin. uncompressed

sizeoptimize images X Xshard domains X X

flush the documentavoid iframes

simplify CSS selectors X X

Page 48: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Performance Analyzers: other rules

YSlow

Page Speed

Pagetest VRTA neXpert

use persistent conns X X Xreduce cookies 2.0 X X Xavoid net congestion Xincrease MTU, TCP win

X

avoid server congestion

X

remove unused CSS Xspecify image dims Xuse GET for Ajax 2.0reduce DOM elements

2.0

avoid 404 errors 2.0avoid Alpha filters 2.0don't scale images 2.0 Xoptimize favicon 2.0

Page 49: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Top 10 Performance

YSlowPage

SpeedAOL ?* yellow

eBay 82 yellow

Facebook 68 red

Google Search 95 green

Live Search 93 green

MSN.com 72 yellow

MySpace 84 yellow

Wikipedia 66 yellow

Yahoo! 96 yellow

YouTube 77 yellow* YSlow wouldn't start.

Page 50: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Wikipedia

combine 6 scripts, 8 stylesheets

add Expires header

minify JavaScript, save 39K (36%)

avoid inline script after stylesheet

31K (41%) unused CSS

remove ETags

Page 51: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Yahoo!

shard l.yimg.com

46K (49%) unused CSS

~90 very inefficient CSS selectors

Page 52: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

1.long HTML doc response2.flush (good)3.inline script blocks .js

var pageName='HomePagePortal';

4.scripts block5.ads .js non-blocking (good)6.26 bg images – no sprites7.sharded domains – pics & rtm

(good)8.compress images by 20% 9.thumbs load slowly – HTTP/1.0?10. remove ETags (?)11. ~40 inefficient CSS selectors

.playgrnd * {}

1

9

76

54

32

4

4 4

8

www.ebay.com

Page 53: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

AOL

shard portal.aolcdn.com

combine 8 scripts

simplify CSS selectors

avoid inline script after stylesheetjQueryEnabled = true;

remove 97K (49%) unused CSS

Page 54: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Facebook

combine 13 scripts, 6 stylesheets

sprite 31 background images

reduce images by 106K (44%)

put stylesheets above scripts

remove 102K (50%) unused CSS

Page 55: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

MSN.com

combine 13 scripts

sprite 26 background images

put stylesheets above scripts

avoid inline script after stylesheet

Page 56: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

YouTube

add Expires header (can't?)

minify JavaScript, save ~29K (14%

Page 57: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

CNet Performance Analysis

coolflushed documentHTTP/1.0 downgrade

opportunitiesload oreo.moo.rb.combined.js asyncsplit i.i.com.com across two domainsconcatenate 10 scriptssprite 25 CSS background images30 resources with short Expires62% (62K) of CSS not used

requests: 107load time: 3.7

secsxfer size: 436KYSlow: F (48)

Page 58: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

http://www.shopping.com

• slow spots:• top – shard CSS and JS, flush• middle – shard images• bottom – scripts (async?)

• use CSS sprites (42 bg images)

• add future Expires header

• optimize images (50K, 20%)

• remove ETags

Page 59: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

takeaways

focus on the frontend

run Page Speed and YSlow

speed matters

Page 60: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

impact on revenue

Google:

Yahoo:

Amazon:

1 http://home.blarg.net/~glinden/StanfordDataMining.2006-11-29.ppt2 http://www.slideshare.net/stoyan/yslow-20-presentation

+500 ms -20% traffic1

+400 ms -5-9% full-page traffic2

+100 ms -1% sales1

Page 61: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

cost savings

hardware – reduced load

bandwidth – reduced response size

http://billwscott.com/share/presentations/2008/stanford/HPWP-RealWorld.pdf

Page 62: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

if you want better user experience more revenue reduced operating expenses

the strategy is clear

Even Faster Web Sites

Page 63: Steve Souders souders@google.com  Even Faster Web Sites Disclaimer: This content does not necessarily

Steve [email protected]

http://stevesouders.com/docs/velocity-20090622.ppt