Date post: | 27-Mar-2015 |
Category: |
Documents |
Upload: | jordan-reilly |
View: | 221 times |
Download: | 2 times |
17%
83%
iGoogle, primed cache
the importance of frontend performance
9% 91%
iGoogle, empty cache
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
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
Sept 2007
June 2009
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
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
AOLeBayFacebookMySpaceWikipediaYahoo!
Why focus on JavaScript?
YouTube
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
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
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?
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
Loading Scripts Without Blocking
XHR Eval
XHR Injection
Script in Iframe
Script DOM Element
Script Defer
document.write Script Tag
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
browser busy indicators
Loading Scripts Without Blocking
*Only other document.write scripts are downloaded in parallel (in the same script block).
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
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
before
after
Loading Scripts Without Blocking
*Only other document.write scripts are downloaded in parallel (in the same script block).
!IE
what about
inlined code that depends on the script?
coupling techniques
hardcoded callback
window onload
timer
degrading script tags
script onload
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
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!
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
eBayMSNMySpaceWikipedia
Positioning Inline Scripts
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"?
www.yahoo.com
http://news.google.com
news.google.com
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/
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()
successful flushing
Google Search
external resource downloaded earlycontent visible to the user
googleimageimagescriptimage204
http://www.google.com/images/nav_logo4.png
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>
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 {}
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
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
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/
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
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
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/
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
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
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
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.
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
Yahoo!
shard l.yimg.com
46K (49%) unused CSS
~90 very inefficient CSS selectors
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
AOL
shard portal.aolcdn.com
combine 8 scripts
simplify CSS selectors
avoid inline script after stylesheetjQueryEnabled = true;
remove 97K (49%) unused CSS
combine 13 scripts, 6 stylesheets
sprite 31 background images
reduce images by 106K (44%)
put stylesheets above scripts
remove 102K (50%) unused CSS
MSN.com
combine 13 scripts
sprite 26 background images
put stylesheets above scripts
avoid inline script after stylesheet
YouTube
add Expires header (can't?)
minify JavaScript, save ~29K (14%
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)
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
takeaways
focus on the frontend
run Page Speed and YSlow
speed matters
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
cost savings
hardware – reduced load
bandwidth – reduced response size
http://billwscott.com/share/presentations/2008/stanford/HPWP-RealWorld.pdf
if you want better user experience more revenue reduced operating expenses
the strategy is clear
Even Faster Web Sites