49
JavaScript Performance stevesouders.com/docs/sfjs-20120112.pptx Disclaimer: This content does not necessarily reflect the opinions of my employer.

JavaScript Performance (at SFJS)

Embed Size (px)

DESCRIPTION

A deep dive into async script loading.

Citation preview

Page 1: JavaScript Performance (at SFJS)

JavaScript Performance

stevesouders.com/docs/sfjs-20120112.pptxDisclaimer: This content does not necessarily reflect the opinions of my employer.

Page 2: JavaScript Performance (at SFJS)

Cuzillion SpriteMeYSlow Hammerhead

Page 3: JavaScript Performance (at SFJS)

drives traffic

improves UX

increases revenue

reduces costs

Web

Performance

OptimizationWPO

Page 4: JavaScript Performance (at SFJS)

What’s the #1 cause

of slow web pages?

Page 5: JavaScript Performance (at SFJS)

JAVASCRIPT!

Page 6: JavaScript Performance (at SFJS)
Page 7: JavaScript Performance (at SFJS)
Page 8: JavaScript Performance (at SFJS)

{31%

all requests containing “.js” are skipped

Page 9: JavaScript Performance (at SFJS)

http://httparchive.org/trends.php?s=intersection

Page 10: JavaScript Performance (at SFJS)

1995: scripts in HEAD

<head><script src=‘a.js’></script></head>

blocks other downloads (IE 6-7, images in IE, iframes)

downloaded sequentially (IE 6-7)

blocks rendering during download & parse-execute

Page 11: JavaScript Performance (at SFJS)

2007: move scripts to bottom

...<script src=‘a.js’></script></body>

doesn’t block other downloads

downloaded sequentially in IE 6-7

blocks rendering during download & parse-execute

Page 12: JavaScript Performance (at SFJS)

2009: load scripts async

var se = document.createElement(‘script’);

se.src = ‘a.js’;document.getElementsByTagName(‘head’)[0].appendChild(se);

doesn’t block other downloads

downloaded in parallel (all browsers)

blocks rendering during parse-execute

Page 13: JavaScript Performance (at SFJS)

2010: async + on-demand exec

var se = new Image(); // Objectse.onload = registerScript;se.src = ‘a.js’;

separate download from parse-execute

doesn’t block other downloads

downloaded in parallel (all browsers)

doesn’t block rendering until demanded

Page 14: JavaScript Performance (at SFJS)

20??: markup

Page 15: JavaScript Performance (at SFJS)

script async & deferparsing doesn’t wait for script:• async – executed when available• defer – executed when parsing finished

when is it downloaded?

missing:• defer download AND execution• async/defer download, execute on demand

Page 16: JavaScript Performance (at SFJS)

20??: markup

<script src=‘a.js’ [async|defer|noexecute] [deferdownload]>

doesn’t block downloads

downloaded in parallel

doesn’t block rendering until demanded

doesn’t contend for a connection

easier

Page 17: JavaScript Performance (at SFJS)

ControlJSa JavaScript module for making scripts load faster

just change HTML

inline & external scripts

<script type=‘text/cjs’ data-cjssrc=‘main.js’></script>

<script type=‘text/cjs’>var name = getName();</script>

http://controljs.org/

Page 18: JavaScript Performance (at SFJS)

ControlJSa JavaScript module for making scripts load faster

download without executing<script type=‘text/cjs’ data-cjssrc=‘main.js’ data-cjsexec=false><script>

Later if/when needed:CJS.execScript(src);

Page 19: JavaScript Performance (at SFJS)

GMail Mobile<script type=‘text/javascript’>

/*

var ...

*/

</script>

get script DOM element's text

remove comments

eval() when invoked

awesome for prefetching JS that might (not) be needed

http://goo.gl/l5ZLQ

Page 20: JavaScript Performance (at SFJS)

localStorage

Page 21: JavaScript Performance (at SFJS)

yuiblog.com/blog/2007/01/04/performance-research-part-2/

Page 22: JavaScript Performance (at SFJS)

blaze.io/mobile/understanding-mobile-cache-sizes/

Page 23: JavaScript Performance (at SFJS)

Home screen apps on iPhone are slower because resources

are re-requested even though they should be read from

cache.

Page 24: JavaScript Performance (at SFJS)

localStoragewindow.localStorage:

setItem()getItem()removeItem()clear()

also sessionStorage

all popular browsers, 5MB maxhttp://dev.w3.org/html5/webstorage/http://diveintohtml5.org/storage.html

Page 25: JavaScript Performance (at SFJS)

localStorage as cache

1st doc: write JS & CSS blocks to localStoragemres.-0yDUQJ03U8Hjija: <script>(function(){...

set cookie with entries & versionMRES=-0yDUQJ03U8Hjija:-4EaJoFuDoX0iloI:...

later docs: read JS & CSS from localStoragedocument.write( localStorage.getItem(mres.-0yDUQJ03U8Hjija) );

http://stevesouders.com/blog/2011/03/28/storager-case-study-bing-google/

Page 26: JavaScript Performance (at SFJS)

Google Analytics Async Snippet

var ga = document.createElement(‘script’);ga.type = ‘text/javascript’;ga.async = true;ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’)+‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0];

s.parentNode.insertBefore(ga, s);

code.google.com/apis/analytics/docs/tracking/asyncTracking.html

Page 27: JavaScript Performance (at SFJS)

var ga = document.createElement(‘script’);ga.type = ‘text/javascript’;ga.async = true;ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’)+‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0];

s.parentNode.insertBefore(ga, s);

stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/

avoid mixed content warning

protocol relative URLs have problems

set src last

Page 28: JavaScript Performance (at SFJS)

var ga = document.createElement(‘script’);ga.type = ‘text/javascript’;ga.async = true;ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’)+‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0];

s.parentNode.insertBefore(ga, s);

stevesouders.com/blog/2010/05/11/appendchild-vs-insertbefore/

stevesouders.com/blog/2010/05/12/autohead-my-first-browserscope-user-test/

previously: getElementsByTagName(‘head’)[0].appendChild(ga)

HEAD might not exist

Android 1.5, iPhone 3.0, Opera 8.50, Safari 3.2

Page 29: JavaScript Performance (at SFJS)

var ga = document.createElement(‘script’);ga.type = ‘text/javascript’;ga.async = true;ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’)+‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0];

s.parentNode.insertBefore(ga, s);

stevesouders.com/tests/jsorder.php

some browsers preserve execution order

Firefox 3.6, Opera, OmniWeb

Page 30: JavaScript Performance (at SFJS)

stevesouders.com/tests/jsorder.php

Page 31: JavaScript Performance (at SFJS)
Page 32: JavaScript Performance (at SFJS)

var ga = document.createElement(‘script’);ga.type = ‘text/javascript’;ga.async = true;ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’)+‘.google-analytics.com/ga.js’;

var s = document.getElementsByTagName(‘script’)[0];

s.parentNode.insertBefore(ga, s);

stevesouders.com/tests/jsorder.php

some browsers preserve execution order

Firefox 3.6, Opera, OmniWeb

async=true fixes this (except Opera)

Page 33: JavaScript Performance (at SFJS)

<html><head>

<link rel=stylesheet ...><style>...</style><script [...]></script>

</head>

<body><div><p><ul>

</body></html>

onload:

C

B

A

D

Page 34: JavaScript Performance (at SFJS)

<html><head>

<link rel=stylesheet ...><style>...</style><script [...]></script>

</head>

<body><div><p><ul>

</body></html>

onload:

A

script loads sooner

beacon fires sooner

blocks other async (Opera)

may block rendering

Page 35: JavaScript Performance (at SFJS)

<html><head>

<link rel=stylesheet ...><style>...</style><script [...]></script>

</head>

<body><div><p><ul>

</body></html>

onload:

B

script loads later

beacon fires later

blocks fewer async (Opera)

may block rendering

Page 36: JavaScript Performance (at SFJS)

<html><head>

<link rel=stylesheet ...><style>...</style><script [...]></script>

</head>

<body><div><p><ul>

</body></html>

onload:

C

script loads last

beacon fires late

doesn’t block async

doesn’t block rendering

Page 37: JavaScript Performance (at SFJS)

<html><head>

<link rel=stylesheet ...><style>...</style><script [...]></script>

</head>

<body><div><p><ul>

</body></html>

onload:

script loads after page

beacon fires very late

doesn’t block async

doesn’t block rendering

onload fires sooner

D

Page 38: JavaScript Performance (at SFJS)

more

Page 39: JavaScript Performance (at SFJS)
Page 40: JavaScript Performance (at SFJS)

stevesouders.com/blog/2011/12/01/silk-ipad-galaxy-comparison/

Page 41: JavaScript Performance (at SFJS)

stevesouders.com/mobileperf/mobileperfbkm.php

Page 42: JavaScript Performance (at SFJS)
Page 43: JavaScript Performance (at SFJS)
Page 44: JavaScript Performance (at SFJS)
Page 45: JavaScript Performance (at SFJS)
Page 46: JavaScript Performance (at SFJS)

Top 100

Top 1000

Page 47: JavaScript Performance (at SFJS)
Page 48: JavaScript Performance (at SFJS)

WPO

WebPagetest.org

Cuzillion.com

Browserscope.org

ControlJS.org

localStorage

takeawaysGA snippet is

good

Loadtimer.org

MobilePerf.org

HTTPArchive.org

Velocity

stevesouders.com

Page 49: JavaScript Performance (at SFJS)

@souders

http://stevesouders.com/docs/sfjs-20120112.pptx