SlideShare a Scribd company logo
Sanjeev ghai 12
the importance of frontend 
performance 
9% 91% 
17% 83% 
iGoogle, primed cache 
iGoogle, empty cache
Sanjeev ghai 12
Sanjeev ghai 12
Sanjeev ghai 12
Sept 2007
14 RULES 
1. MAKE FEWER HTTP REQUESTS 
2. USE A CDN 
3. ADD AN EXPIRES HEADER 
4. GZIP COMPONENTS 
5. PUT STYLESHEETS AT THE TOP 
6. PUT SCRIPTS AT THE BOTTOM 
7. AVOID CSS EXPRESSIONS 
8. MAKE JS AND CSS EXTERNAL 
9. REDUCE DNS LOOKUPS 
10.MINIFY JS 
11.AVOID REDIRECTS 
12.REMOVE DUPLICATE SCRIPTS 
13.CONFIGURE ETAGS 
14.MAKE AJAX CACHEABLE
June 2009
Even Faster Web Sites 
Splitting the initial payload 
Loading scripts without blocking 
Coupling asynchronous scripts 
Positioning inline scripts 
Sharding dominant domains 
Flushing the document early 
Using iframes sparingly 
Simplifying CSS Selectors 
Understanding Ajax performance..........Doug Crockford 
Creating responsive web apps............Ben Galbraith, Dion Almaer 
Writing efficient JavaScript.............Nicholas Zakas 
Scaling with Comet.....................Dylan Schiemann 
Going beyond gzipping...............Tony Gentilcore 
Optimizing images...................Stoyan Stefanov, Nicole Sullivan
Why focus on JavaScript? 
WFMaikcyYieSapbepheABoaodOocaoieakyL! 
YouTube
scripts block 
<script src="A.js"> blocks parallel 
downloads and rendering 
9 secs: IE 6-7, FF 3.0, Chr 1, Op 9-10, Saf 3 
7 secs: IE 8, FF 3.5(?), Chr 2, Saf 4
MSN 
MSN.com: parallel scripts 
Scripts 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)
Loading Scripts Without Blocking 
XHR Eval 
XHR Injection 
Script in Iframe 
Script DOM Element 
Script Defer 
document.write Script Tag
XHR Eval 
var xhrObj = getXHRObject(); 
xhrObj.onreadystatechange = 
function() { 
if ( xhrObj.readyState != 4 ) return; 
eval(xhrObj.responseText); 
}; 
xhrObj.open('GET', 'A.js', true); 
xhrObj.send(''); 
script must have same domain as main page 
must refactor script
XHR Injection 
var xhrObj = getXHRObject(); 
xhrObj.onreadystatechange = 
function() { 
if ( xhrObj.readyState != 4 ) return; 
var se=document.createElement('script'); 
document.getElementsByTagName('head') 
[0].appendChild(se); 
se.text = xhrObj.responseText; 
}; 
xhrObj.open('GET', 'A.js', true); 
xhrObj.send(''); 
script must have same domain as main page
Script in Iframe 
<iframe src='A.html' width=0 height=0 
frameborder=0 id=frame1></iframe> 
iframe must have same domain as main page 
must refactor script: 
// access iframe from main page 
window.frames[0].createNewDiv(); 
// access main page from iframe 
parent.document.createElement('div');
Script DOM Element 
var 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
Script Defer 
<script defer src='A.js'></script> 
only supported in IE (just landed in FF 3.1) 
script and main page domains can differ 
no need to refactor JavaScript
document.write Script Tag 
document.write("<script 
type='text/javascript' src='A.js'> 
</script>"); 
parallelization only works in IE 
parallel downloads for scripts, nothing else 
all document.writes must be in same 
script block
Load Scripts Without Blocking 
*Only other document.write scripts are downloaded in parallel (in the same script block).
and the winner is... 
XHR Eval 
XHR Injection 
Script in iframe 
Script DOM 
Element 
Script Defer 
Script DOM 
Element 
Script Defer 
Script DOM Element 
Script DOM Element (FF) 
Script Defer (IE) 
XHR Eval 
XHR Injection 
Script in iframe 
Script DOM Element (IE) 
XHR Injection 
XHR Eval 
Script DOM Element (IE) 
Script DOM Element (FF) 
Script Defer (IE) 
Managed XHR Eval 
Managed XHR Injection 
Managed XHR Injection 
Managed XHR Eval 
Managed XHR Injection 
Managed XHR Eval 
Script DOM Element 
Script DOM Element (FF) 
Script Defer (IE) 
Managed XHR Eval 
Managed XHR Injection 
different domains same domains 
no order 
preserve 
order 
no order 
no busy 
show busy 
no busy show busy 
preserve 
order
Sanjeev ghai 12
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
going beyond gzipping 
Tony Gentilcore, Chapter 9, Even Faster 
Web Sites 
Rule 4: Gzip Components from HPWS 
HTTP/1.1 
request: Accept-Encoding: gzip,deflate 
response: Content-Encoding: gzip 
Apache 2.x: 
AddOutputFilterByType DEFLATE 
text/html text/css application/x-javascript
benefits of gzipping 
70% reduction in transfer size 
not just for HTML!! 
all text: JavaScript, CSS, XML, JSON 
not binary: images, PDF, Flash
so what's the issue? 
15% of your users get uncompressed responses 
surprize! why? 
old browsers? no 
Netscape Navigator 3 – 0.0% 
Netscape Communicator 4 – 0.1% 
Opera 3.5 – 0.0% 
IE <3 – 0.01% 
clue: most prevalent in the Middle East
who's stripping? 
proxy, A-V software Accept-Encoding header 
Ad Muncher stripped 
CA Internet Security Suite Accept-EncodXng: gzip, deflate 
CEQURUX stripped 
Citrix Application Firewall stripped 
ISA 2006 stripped 
McAfee Internet Security 6.0 XXXXXXXXXXXXXXX: +++++++++++++ 
Norton Internet Security 6.0 ---------------: ------------- 
Novell iChain 2.3 stripped 
Novell Client Firewall stripped 
WebWasher stripped 
ZoneAlarm Pro 5.5 XXXXXXXXXXXXXXX: XXXXXXXXXXXXX 
proxies and anti-virus software disable 
compression for easier response filtering
what to do 
don't assume compression 
go the extra mile to reduce response size 
• event delegation (-5%) 
• relative URLs (-3%) 
• minify HTML, JavaScript, and CSS (-4%) 
• use CSS rules over inline styles (-1%) 
• alias long JavaScript symbol names (??) 
Thanks, Tony! 
see Tony's chapter in Even Faster Web Sites
homage to Open Source 
UA Profiler 
Cuzillion 
Episodes 
Hammerhead 
SpriteMe
Sanjeev ghai 12
UA Profiler 
tracks browser performance traits 
http://stevesouders.com/ua/ 
go to the test page 
your browser automatically walks through 
the tests (requires JS) 
results recorded and shared publicly 
currently 20K test results, 13K unique 
testers, 70 browsers 
help out by running the test!
Sanjeev ghai 12
Cuzillion 
'cuz there are a zillion pages to check 
a tool for quickly constructing web pages to 
see how components interact 
http://stevesouders.com/cuzillion/
Sanjeev ghai 12
Episodes 
framework for timing web sites 
• based on JavaScript timers 
• works on Ajax web apps 
• uses window.postMessage (multiple listeners) 
• potential industry standard 
http://stevesouders.com/episodes/
Measuring Performance 
Episodes 
dev box synthetic 
testing 
bucket 
testing 
real user 
data 
Hammerhead
Sanjeev ghai 12
Hammerhead 
moving performance testing upstream 
http://stevesouders.com/hammerhead/ 
Firebug extension 
load M URLs N times, empty & primed cache 
record average & median time 
add'l features: 
export data 
load time measurement 
modal cache clearing 
combine with bandwidth throttler
Sanjeev ghai 12
SpriteMe 
don't say "bite me!#*", say "SpriteMe!" 
create sprites with ease 
http://spriteme.org/ 
bookmarklet 
sprite generator: 
coolRunnings by Jared Hirsch 
http://jaredhirsch.com/coolrunnings/about/ 
http://bitbucket.org/jared/coolrunnings/
takeaways 
focus on the frontend 
run YSlow 
(http://developer.yahoo.com/yslow) 
and Page Speed! 
(http://code.google.com/speed/page-speed/) 
speed matters
Bing: 
Yahoo: 
Google: 
AOL: 
Shopzilla: 
impact on revenue 
+2000 ms ® -4.3% revenue/user1 
+400 ms ® -5-9% full-page traffic2 
+400 ms ® -0.59% searches/user1 
fastest users ® +50% page views3 
-5000 ms ® +7-12% revenue4 
1 http://en.oreilly.com/velocity2009/public/schedule/detail/8523 
2 http://www.slideshare.net/stoyan/yslow-20-presentation 
3 http://en.oreilly.com/velocity2009/public/schedule/detail/7579 
4 http://en.oreilly.com/velocity2009/public/schedule/detail/7709
cost savings 
hardware – reduced load 
Shopzilla – 50% fewer servers 
bandwidth – reduced response size 
http://billwscott.com/share/presentations/2008/stanford/HPWP-RealWorld.pdf
if you want 
better user experience 
more revenue 
reduced operating costs 
the strategy is clear 
Even Faster Web Sites
1:00 – book signing at Barnes & Noble 
3:20 – free consulting at Google booth 
Steve Souders 
souders@google.com 
http://stevesouders.com/docs/oscon-20090722.ppt

More Related Content

What's hot (20)

PDF
Node Security: The Good, Bad & Ugly
Bishan Singh
 
PDF
HTML5 JavaScript APIs
Remy Sharp
 
PDF
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
DK Lee
 
PDF
Ruby MVC from scratch with Rack
DonSchado
 
PDF
Understanding the Node.js Platform
Domenic Denicola
 
PDF
EWD 3 Training Course Part 20: The DocumentNode Object
Rob Tweed
 
PDF
High Performance Ajax Applications
Siarhei Barysiuk
 
PDF
Introduction to Node.js
Somkiat Puisungnoen
 
PDF
ApacheConNA 2015: What's new in Apache httpd 2.4
Jim Jagielski
 
PDF
Front end performance tip
Steve Yu
 
PDF
Front End Performance
Konstantin Käfer
 
PPTX
Front end performance optimization
Stevie T
 
PDF
Building an HTML5 Video Player
Jim Jeffers
 
PDF
Vue 淺談前端建置工具
andyyou
 
KEY
Deploying
soon
 
PPTX
JavaScript Performance Patterns
Stoyan Stefanov
 
PDF
Rails Girls: Programming, Web Applications and Ruby on Rails
DonSchado
 
PDF
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
Jeongkyu Shin
 
KEY
[Coscup 2012] JavascriptMVC
Alive Kuo
 
PPTX
Client-side JavaScript Vulnerabilities
Ory Segal
 
Node Security: The Good, Bad & Ugly
Bishan Singh
 
HTML5 JavaScript APIs
Remy Sharp
 
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
DK Lee
 
Ruby MVC from scratch with Rack
DonSchado
 
Understanding the Node.js Platform
Domenic Denicola
 
EWD 3 Training Course Part 20: The DocumentNode Object
Rob Tweed
 
High Performance Ajax Applications
Siarhei Barysiuk
 
Introduction to Node.js
Somkiat Puisungnoen
 
ApacheConNA 2015: What's new in Apache httpd 2.4
Jim Jagielski
 
Front end performance tip
Steve Yu
 
Front End Performance
Konstantin Käfer
 
Front end performance optimization
Stevie T
 
Building an HTML5 Video Player
Jim Jeffers
 
Vue 淺談前端建置工具
andyyou
 
Deploying
soon
 
JavaScript Performance Patterns
Stoyan Stefanov
 
Rails Girls: Programming, Web Applications and Ruby on Rails
DonSchado
 
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
Jeongkyu Shin
 
[Coscup 2012] JavascriptMVC
Alive Kuo
 
Client-side JavaScript Vulnerabilities
Ory Segal
 

Viewers also liked (9)

PPT
Olumide adeola pidan c
Praveen kumar
 
PPT
Sanjeev ghei, sanjeev ghai income tax,
Praveen kumar
 
PPT
Olumide pidan
Praveen kumar
 
PPT
Sanjeev ghai, sanjeev ghai irs, sanjeev ghei, sanjeev ghai income tax
Praveen kumar
 
PPTX
Purva Reviews
Praveen kumar
 
PPTX
olumide adeola pidan
Praveen kumar
 
PPSX
Sanjeev ghai 1
Praveen kumar
 
PPS
Sanjeev ghei 3
Praveen kumar
 
PPSX
Sanjeev ghai income tax 12
Praveen kumar
 
Olumide adeola pidan c
Praveen kumar
 
Sanjeev ghei, sanjeev ghai income tax,
Praveen kumar
 
Olumide pidan
Praveen kumar
 
Sanjeev ghai, sanjeev ghai irs, sanjeev ghei, sanjeev ghai income tax
Praveen kumar
 
Purva Reviews
Praveen kumar
 
olumide adeola pidan
Praveen kumar
 
Sanjeev ghai 1
Praveen kumar
 
Sanjeev ghei 3
Praveen kumar
 
Sanjeev ghai income tax 12
Praveen kumar
 
Ad

Similar to Sanjeev ghai 12 (20)

PPT
Web 2.0 Expo: Even Faster Web Sites
Steve Souders
 
PPT
Web20expo 20080425
Media Gorod
 
KEY
Developing High Performance Web Apps - CodeMash 2011
Timothy Fisher
 
PDF
Developing High Performance Web Apps
Timothy Fisher
 
PPT
Even Faster Web Sites at The Ajax Experience
Steve Souders
 
PPT
Oscon 20080724
linkedin_resptest2
 
PPTX
Presentation Tier optimizations
Anup Hariharan Nair
 
PPT
Build Your Own CMS with Apache Sling
Bob Paulin
 
PPTX
JavaScript front end performance optimizations
Chris Love
 
PPT
Even Faster Web Sites at jQuery Conference '09
Steve Souders
 
PDF
Web Performance Part 4 "Client-side performance"
Binary Studio
 
PPTX
W3 conf hill-html5-security-realities
Brad Hill
 
PPTX
JavaScript performance patterns
Stoyan Stefanov
 
ODP
Javascript frameworks: Backbone.js
Soós Gábor
 
PDF
Webpack
Sofian Hadiwijaya
 
PDF
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
tdc-globalcode
 
PDF
5.node js
Geunhyung Kim
 
PDF
HTML 5 - Overview
Marcelio Leal
 
PDF
HTML5: huh, what is it good for?
Remy Sharp
 
PDF
Cape Cod Web Technology Meetup - 2
Asher Martin
 
Web 2.0 Expo: Even Faster Web Sites
Steve Souders
 
Web20expo 20080425
Media Gorod
 
Developing High Performance Web Apps - CodeMash 2011
Timothy Fisher
 
Developing High Performance Web Apps
Timothy Fisher
 
Even Faster Web Sites at The Ajax Experience
Steve Souders
 
Oscon 20080724
linkedin_resptest2
 
Presentation Tier optimizations
Anup Hariharan Nair
 
Build Your Own CMS with Apache Sling
Bob Paulin
 
JavaScript front end performance optimizations
Chris Love
 
Even Faster Web Sites at jQuery Conference '09
Steve Souders
 
Web Performance Part 4 "Client-side performance"
Binary Studio
 
W3 conf hill-html5-security-realities
Brad Hill
 
JavaScript performance patterns
Stoyan Stefanov
 
Javascript frameworks: Backbone.js
Soós Gábor
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
tdc-globalcode
 
5.node js
Geunhyung Kim
 
HTML 5 - Overview
Marcelio Leal
 
HTML5: huh, what is it good for?
Remy Sharp
 
Cape Cod Web Technology Meetup - 2
Asher Martin
 
Ad

More from Praveen kumar (10)

PPT
Olumide adeola pidan d
Praveen kumar
 
PPT
Olumide adeola pidan b
Praveen kumar
 
PPT
Olumide adeola pidan a
Praveen kumar
 
PPT
Eschol Tech Solutions
Praveen kumar
 
PPTX
olumide adeola pidan
Praveen kumar
 
PPTX
Sanjeev ghai income tax
Praveen kumar
 
PPTX
Sanjeev ghei
Praveen kumar
 
PPTX
Sanjeev ghei
Praveen kumar
 
PPTX
Sanjeev ghai income tax
Praveen kumar
 
PPTX
Purva Reviews
Praveen kumar
 
Olumide adeola pidan d
Praveen kumar
 
Olumide adeola pidan b
Praveen kumar
 
Olumide adeola pidan a
Praveen kumar
 
Eschol Tech Solutions
Praveen kumar
 
olumide adeola pidan
Praveen kumar
 
Sanjeev ghai income tax
Praveen kumar
 
Sanjeev ghei
Praveen kumar
 
Sanjeev ghei
Praveen kumar
 
Sanjeev ghai income tax
Praveen kumar
 
Purva Reviews
Praveen kumar
 

Recently uploaded (20)

PDF
Fashion project1 kebaya reimagined slideshow
reysultane
 
PPTX
The birth & Rise of python.pptx vaibhavd
vaibhavdobariyal79
 
PPT
UNIT- 2 CARBON FOOT PRINT.ppt yvvuvvvvvvyvy
sriram270905
 
PDF
Hossain Kamyab on Mixing and Matching Furniture.pdf
Hossain Kamyab
 
PDF
Home_Decor_Presentation and idiea with decor
sp1357556
 
PPTX
Digital Printing presentation-update-26.08.24.pptx
MDFoysalAhmed13
 
PDF
SS27 Women's Fashion Trend Book Peclers Paris
Peclers Paris
 
PDF
TAIPAN99 Situs Pkv Games Terbaik Bermain Kapan Pun Dimana Dengan Mudah #1
TAIPAN 99
 
PDF
Zidane ben hmida _ Portfolio
Zidane Ben Hmida
 
PPTX
Residential_Interior_Design_No_Images.pptx
hasansarkeraidt
 
DOCX
Personalized Jewellery Guide: Engraved Rings, Initial Necklaces & Birthstones...
Dishis jewels
 
PPTX
Modern_Dhaka_Apartment_Interior_Design.pptx
hasansarkeraidt
 
PPTX
3. Introduction to Materials and springs.pptx
YESIMSMART
 
PPTX
Blended Wing Body y jet engines Aircrafts.pptx
anshul9051
 
PPTX
designing in footwear- exploring the art and science behind shoe design
madhuvidya7
 
PPTX
Morph Slide Presentation transition.pptx
ArifaAkter10
 
PDF
SS27 Environments & Design Trend Book Peclers Paris
Peclers Paris
 
PPTX
Engagement for marriage life ethics b.pptx
SyedBabar19
 
PPTX
confluence of tradition in modernity- design approaches and design thinking
madhuvidya7
 
PPTX
MALURI KISHORE-.pptxdsrhbcdsfvvghhhggggfff
sakthick46
 
Fashion project1 kebaya reimagined slideshow
reysultane
 
The birth & Rise of python.pptx vaibhavd
vaibhavdobariyal79
 
UNIT- 2 CARBON FOOT PRINT.ppt yvvuvvvvvvyvy
sriram270905
 
Hossain Kamyab on Mixing and Matching Furniture.pdf
Hossain Kamyab
 
Home_Decor_Presentation and idiea with decor
sp1357556
 
Digital Printing presentation-update-26.08.24.pptx
MDFoysalAhmed13
 
SS27 Women's Fashion Trend Book Peclers Paris
Peclers Paris
 
TAIPAN99 Situs Pkv Games Terbaik Bermain Kapan Pun Dimana Dengan Mudah #1
TAIPAN 99
 
Zidane ben hmida _ Portfolio
Zidane Ben Hmida
 
Residential_Interior_Design_No_Images.pptx
hasansarkeraidt
 
Personalized Jewellery Guide: Engraved Rings, Initial Necklaces & Birthstones...
Dishis jewels
 
Modern_Dhaka_Apartment_Interior_Design.pptx
hasansarkeraidt
 
3. Introduction to Materials and springs.pptx
YESIMSMART
 
Blended Wing Body y jet engines Aircrafts.pptx
anshul9051
 
designing in footwear- exploring the art and science behind shoe design
madhuvidya7
 
Morph Slide Presentation transition.pptx
ArifaAkter10
 
SS27 Environments & Design Trend Book Peclers Paris
Peclers Paris
 
Engagement for marriage life ethics b.pptx
SyedBabar19
 
confluence of tradition in modernity- design approaches and design thinking
madhuvidya7
 
MALURI KISHORE-.pptxdsrhbcdsfvvghhhggggfff
sakthick46
 

Sanjeev ghai 12

  • 2. the importance of frontend performance 9% 91% 17% 83% iGoogle, primed cache iGoogle, empty cache
  • 7. 14 RULES 1. MAKE FEWER HTTP REQUESTS 2. USE A CDN 3. ADD AN EXPIRES HEADER 4. GZIP COMPONENTS 5. PUT STYLESHEETS AT THE TOP 6. PUT SCRIPTS AT THE BOTTOM 7. AVOID CSS EXPRESSIONS 8. MAKE JS AND CSS EXTERNAL 9. REDUCE DNS LOOKUPS 10.MINIFY JS 11.AVOID REDIRECTS 12.REMOVE DUPLICATE SCRIPTS 13.CONFIGURE ETAGS 14.MAKE AJAX CACHEABLE
  • 9. Even Faster Web Sites Splitting the initial payload Loading scripts without blocking Coupling asynchronous scripts Positioning inline scripts Sharding dominant domains Flushing the document early Using iframes sparingly Simplifying CSS Selectors Understanding Ajax performance..........Doug Crockford Creating responsive web apps............Ben Galbraith, Dion Almaer Writing efficient JavaScript.............Nicholas Zakas Scaling with Comet.....................Dylan Schiemann Going beyond gzipping...............Tony Gentilcore Optimizing images...................Stoyan Stefanov, Nicole Sullivan
  • 10. Why focus on JavaScript? WFMaikcyYieSapbepheABoaodOocaoieakyL! YouTube
  • 11. scripts block <script src="A.js"> blocks parallel downloads and rendering 9 secs: IE 6-7, FF 3.0, Chr 1, Op 9-10, Saf 3 7 secs: IE 8, FF 3.5(?), Chr 2, Saf 4
  • 12. MSN MSN.com: parallel scripts Scripts 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)
  • 13. Loading Scripts Without Blocking XHR Eval XHR Injection Script in Iframe Script DOM Element Script Defer document.write Script Tag
  • 14. XHR Eval var xhrObj = getXHRObject(); xhrObj.onreadystatechange = function() { if ( xhrObj.readyState != 4 ) return; eval(xhrObj.responseText); }; xhrObj.open('GET', 'A.js', true); xhrObj.send(''); script must have same domain as main page must refactor script
  • 15. XHR Injection var xhrObj = getXHRObject(); xhrObj.onreadystatechange = function() { if ( xhrObj.readyState != 4 ) return; var se=document.createElement('script'); document.getElementsByTagName('head') [0].appendChild(se); se.text = xhrObj.responseText; }; xhrObj.open('GET', 'A.js', true); xhrObj.send(''); script must have same domain as main page
  • 16. Script in Iframe <iframe src='A.html' width=0 height=0 frameborder=0 id=frame1></iframe> iframe must have same domain as main page must refactor script: // access iframe from main page window.frames[0].createNewDiv(); // access main page from iframe parent.document.createElement('div');
  • 17. Script DOM Element var 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
  • 18. Script Defer <script defer src='A.js'></script> only supported in IE (just landed in FF 3.1) script and main page domains can differ no need to refactor JavaScript
  • 19. document.write Script Tag document.write("<script type='text/javascript' src='A.js'> </script>"); parallelization only works in IE parallel downloads for scripts, nothing else all document.writes must be in same script block
  • 20. Load Scripts Without Blocking *Only other document.write scripts are downloaded in parallel (in the same script block).
  • 21. and the winner is... XHR Eval XHR Injection Script in iframe Script DOM Element Script Defer Script DOM Element Script Defer Script DOM Element Script DOM Element (FF) Script Defer (IE) XHR Eval XHR Injection Script in iframe Script DOM Element (IE) XHR Injection XHR Eval Script DOM Element (IE) Script DOM Element (FF) Script Defer (IE) Managed XHR Eval Managed XHR Injection Managed XHR Injection Managed XHR Eval Managed XHR Injection Managed XHR Eval Script DOM Element Script DOM Element (FF) Script Defer (IE) Managed XHR Eval Managed XHR Injection different domains same domains no order preserve order no order no busy show busy no busy show busy preserve order
  • 23. 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
  • 25. Loading Scripts Without Blocking *Only other document.write scripts are downloaded in parallel (in the same script block). !IE
  • 26. what about inlined code that depends on the script?
  • 27. coupling techniques hardcoded callback window onload timer degrading script tags script onload
  • 28. 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
  • 29. going beyond gzipping Tony Gentilcore, Chapter 9, Even Faster Web Sites Rule 4: Gzip Components from HPWS HTTP/1.1 request: Accept-Encoding: gzip,deflate response: Content-Encoding: gzip Apache 2.x: AddOutputFilterByType DEFLATE text/html text/css application/x-javascript
  • 30. benefits of gzipping 70% reduction in transfer size not just for HTML!! all text: JavaScript, CSS, XML, JSON not binary: images, PDF, Flash
  • 31. so what's the issue? 15% of your users get uncompressed responses surprize! why? old browsers? no Netscape Navigator 3 – 0.0% Netscape Communicator 4 – 0.1% Opera 3.5 – 0.0% IE <3 – 0.01% clue: most prevalent in the Middle East
  • 32. who's stripping? proxy, A-V software Accept-Encoding header Ad Muncher stripped CA Internet Security Suite Accept-EncodXng: gzip, deflate CEQURUX stripped Citrix Application Firewall stripped ISA 2006 stripped McAfee Internet Security 6.0 XXXXXXXXXXXXXXX: +++++++++++++ Norton Internet Security 6.0 ---------------: ------------- Novell iChain 2.3 stripped Novell Client Firewall stripped WebWasher stripped ZoneAlarm Pro 5.5 XXXXXXXXXXXXXXX: XXXXXXXXXXXXX proxies and anti-virus software disable compression for easier response filtering
  • 33. what to do don't assume compression go the extra mile to reduce response size • event delegation (-5%) • relative URLs (-3%) • minify HTML, JavaScript, and CSS (-4%) • use CSS rules over inline styles (-1%) • alias long JavaScript symbol names (??) Thanks, Tony! see Tony's chapter in Even Faster Web Sites
  • 34. homage to Open Source UA Profiler Cuzillion Episodes Hammerhead SpriteMe
  • 36. UA Profiler tracks browser performance traits http://stevesouders.com/ua/ go to the test page your browser automatically walks through the tests (requires JS) results recorded and shared publicly currently 20K test results, 13K unique testers, 70 browsers help out by running the test!
  • 38. Cuzillion 'cuz there are a zillion pages to check a tool for quickly constructing web pages to see how components interact http://stevesouders.com/cuzillion/
  • 40. Episodes framework for timing web sites • based on JavaScript timers • works on Ajax web apps • uses window.postMessage (multiple listeners) • potential industry standard http://stevesouders.com/episodes/
  • 41. Measuring Performance Episodes dev box synthetic testing bucket testing real user data Hammerhead
  • 43. Hammerhead moving performance testing upstream http://stevesouders.com/hammerhead/ Firebug extension load M URLs N times, empty & primed cache record average & median time add'l features: export data load time measurement modal cache clearing combine with bandwidth throttler
  • 45. SpriteMe don't say "bite me!#*", say "SpriteMe!" create sprites with ease http://spriteme.org/ bookmarklet sprite generator: coolRunnings by Jared Hirsch http://jaredhirsch.com/coolrunnings/about/ http://bitbucket.org/jared/coolrunnings/
  • 46. takeaways focus on the frontend run YSlow (http://developer.yahoo.com/yslow) and Page Speed! (http://code.google.com/speed/page-speed/) speed matters
  • 47. Bing: Yahoo: Google: AOL: Shopzilla: impact on revenue +2000 ms ® -4.3% revenue/user1 +400 ms ® -5-9% full-page traffic2 +400 ms ® -0.59% searches/user1 fastest users ® +50% page views3 -5000 ms ® +7-12% revenue4 1 http://en.oreilly.com/velocity2009/public/schedule/detail/8523 2 http://www.slideshare.net/stoyan/yslow-20-presentation 3 http://en.oreilly.com/velocity2009/public/schedule/detail/7579 4 http://en.oreilly.com/velocity2009/public/schedule/detail/7709
  • 48. cost savings hardware – reduced load Shopzilla – 50% fewer servers bandwidth – reduced response size http://billwscott.com/share/presentations/2008/stanford/HPWP-RealWorld.pdf
  • 49. if you want better user experience more revenue reduced operating costs the strategy is clear Even Faster Web Sites
  • 50. 1:00 – book signing at Barnes & Noble 3:20 – free consulting at Google booth Steve Souders [email protected] http://stevesouders.com/docs/oscon-20090722.ppt

Editor's Notes

  • #2: cc: http://www.flickr.com/photos/rollerfan/2868949733/
  • #3: Data source: Steve Souders Tested on IE6 on Comcast cable modem (~5 mbps) medium powered PC, April 2008.
  • #4: Ten top sites according to Alexa.com. Data source: Steve Souders Tested on IE6 on Comcast cable modem (~5 mbps) medium powered PC, April 2008. http://www.aol.com/ http://www.ebay.com/ http://www.facebook.com/ http://www.google.com/search?hl=en&amp;q=flowers http://www.myspace.com/ http://www.msn.com/ http://search.live.com/results.aspx?q=flowers&amp;mkt=en-us&amp;scope=&amp;FORM=LIVSOP http://en.wikipedia.org/wiki/Flowers http://www.yahoo.com/ http://www.youtube.com/ For Google and Live Search there are so few components (2-4) and they&amp;apos;re mostly cacheable so the HTML document is a bigger percentage.
  • #5: If you could cut performance in half, FE changes would be 40-45%, while BE would be only 5-10%. BE changes are typically more complex: rearchitecture, optimize code, add/modify hw, distribute databases, etc. FE is simpler: change web server config, place scripts and stylesheets differently in the page, combine requests, etc. I’ve worked with dev teams to cut response times on 50 properties, often by 25% or more. And feedback from other companies is similar. Permission to use photo given by Technicolor: http://flickr.com/photos/technicolor/44988148/
  • #10: photo courtesy of Vicki &amp; Chuck Rogers: http://www.flickr.com/photos/two-wrongs/205467442/
  • #13: Data Source: Steve Souders aol76% ebay45% facebook41% google42% live search9% msn37% myspace37% yahoo45% youtube60% wikipedia26% average42%
  • #15: Of the ten top sites, MSN.com (Script DOM Element), Live Search (Script in Iframe), and Yahoo (Script DOM Element) use advanced script loading techniques.
  • #16: All of these allow for parallel downloads, but none of them allow for parallel JS execution – that&amp;apos;s not possible (currently, WebKit is doing some stuff on that).
  • #23: Audio (IE &amp;quot;click&amp;quot;) is another busy indicator. Delayed rendering and delayed onload (&amp;quot;done&amp;quot;) are other busy indicators. Sometimes busy indicators are bad, sometimes good.
  • #24: Data source: Steve Souders Audio (IE &amp;quot;click&amp;quot;) is another busy indicator. Delayed rendering and delayed onload (&amp;quot;done&amp;quot;) are other busy indicators. Sometimes busy indicators are bad, sometimes good.
  • #26: Data source: Steve Souders
  • #27: I&amp;apos;ll do JavaScript and PHP implementations of this logic soon.
  • #28: Permission to use photo given by Reciprocity: http://flickr.com/photos/alanjaras/76000107/
  • #33: Data source: Steve Souders
  • #35: Newer browsers (IE8, Saf4, Chr2) work, but mainstream browsers need a workaround.
  • #40: putting code in the script block doesn&amp;apos;t work in any browser; you have to add stuff to the external script this doesn&amp;apos;t load asynchronously
  • #48: Newer browsers (IE8, Saf4, Chr2) work, but mainstream browsers need a workaround.
  • #51: Newer browsers (IE8, Saf4, Chr2) work, but mainstream browsers need a workaround.
  • #53: loadInterval is 420 ms
  • #82: 72 years = 2,270,592,000 seconds = 500ms * 4.4B page views
  • #83: 72 years = 2,270,592,000 seconds = 500ms * 4.4B page views
  • #84: 72 years = 2,270,592,000 seconds = 500ms * 4.4B page views
  • #85: 72 years = 2,270,592,000 seconds = 500ms * 4.4B page views
  • #86: &amp;quot;thank you&amp;quot; by nj dodge: http://flickr.com/photos/nj_dodge/187190601/