devon 2011-f-4-improve your-javascript

79
Improve your Javascript Performance Devon2011 DAUM Wednesday, November 23, 11

Upload: daum-dna

Post on 16-May-2015

514 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Devon 2011-f-4-improve your-javascript

Improve your Javascript

Performance

Devon2011 DAUMWednesday, November 23, 11

Page 2: Devon 2011-f-4-improve your-javascript

About Me

Web Programmer

Frontend Programmer

FT Projects

Cafe

Tistory T-Edition

Daum Editor

Frontend Research / Support

2002 ~ 2009

2009 ~

Wednesday, November 23, 11

Page 3: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 4: Devon 2011-f-4-improve your-javascript

Why Slow

Wednesday, November 23, 11

Page 5: Devon 2011-f-4-improve your-javascript

Javascript is an “interpreted” language

Wednesday, November 23, 11

Page 6: Devon 2011-f-4-improve your-javascript

‘No’ Compiler Optimization

Wednesday, November 23, 11

Page 7: Devon 2011-f-4-improve your-javascript

But, JIT Compilers in Modern Browser

Wednesday, November 23, 11

Page 8: Devon 2011-f-4-improve your-javascript

JS Engine Benchmarks

IE9

Chrome13

Opera11.5

Firefox7

Safari5.1

0ms 750ms 1500ms 2250ms 3000ms

SunSpider Score in ms (lower is better)

http://www.pcmag.com/article2/0,2817,2349496,00.asp#fbid=ce57IR_ZxrY

Wednesday, November 23, 11

Page 9: Devon 2011-f-4-improve your-javascript

JS Engine Benchmarks

IE9

Chrome13

Opera11.5

Firefox7

Safari5.1

0ms 750ms 1500ms 2250ms 3000ms

SunSpider Score in ms (lower is better)

http://www.pcmag.com/article2/0,2817,2349496,00.asp#fbid=ce57IR_ZxrY

IE7

Wednesday, November 23, 11

Page 10: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 11: Devon 2011-f-4-improve your-javascript

Life of Javascript

Connect

Download

Parse

Execute

DOM Interaction

UI Updates

Wednesday, November 23, 11

Page 12: Devon 2011-f-4-improve your-javascript

JS Engine cares only...

Connect

Download

Parse

Execute

DOM Interaction

UI Updates

Network Latency

Blocking Browser

DOM Interaction Cost

Rendering Issue

Wednesday, November 23, 11

Page 13: Devon 2011-f-4-improve your-javascript

IE����������� ������������������  Empire

HTML5

Wednesday, November 23, 11

Page 14: Devon 2011-f-4-improve your-javascript

2010/10 2011/4 2011/9 2011/10

Usage Share of Web Browsers

IE8 IE6 IE7 IE9 Chrome Safari Firefox

2011/10/03 www.daum.net 기준

Wednesday, November 23, 11

Page 15: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 16: Devon 2011-f-4-improve your-javascript

Old Browsers Usage Share

Mobile Environment

Other Bottlenecks

Wednesday, November 23, 11

Page 17: Devon 2011-f-4-improve your-javascript

Code Tuning Technique

Wednesday, November 23, 11

Page 18: Devon 2011-f-4-improve your-javascript

Scope Chains

Wednesday, November 23, 11

Page 19: Devon 2011-f-4-improve your-javascript

function initUI() { var body = document.body, links = document.getElementsByTagName("a"), i = 0, len = links.length; while (i < len) { update(links[i++]); } document.getElementById("go-btn").onclick = function() { start(); } bd.className = "active";}

Wednesday, November 23, 11

Page 20: Devon 2011-f-4-improve your-javascript

function initUI() { var doc = document, body = doc.body, links = doc.getElementsByTagName("a"), i = 0, len = links.length; while (i < len) { update(links[i++]); } doc.getElementById("go-btn").onclick = function() { start(); } bd.className = "active";}

Wednesday, November 23, 11

Page 21: Devon 2011-f-4-improve your-javascript

function initUI() { var doc = document, body = doc.body, links = doc.getElementsByTagName("a"), i = 0, len = links.length; while (i < len) { update(links[i++]); } doc.getElementById("go-btn").onclick = function() { start(); } bd.className = "active";}

Wednesday, November 23, 11

Page 22: Devon 2011-f-4-improve your-javascript

Nested Members

Wednesday, November 23, 11

Page 23: Devon 2011-f-4-improve your-javascript

function toggle(element) { if (daum.util.dom.hasClass(element, "selected")) { daum.util.dom.removeClass(element, "selected"); } else { daum.util.dom.addClass(element, "selected"); }}

Wednesday, November 23, 11

Page 24: Devon 2011-f-4-improve your-javascript

function toggle(element) { var domutil = daum.util.dom; if (domutil.hasClass(element, "selected")) { domutil.removeClass(element, "selected"); } else { domutil.addClass(element, "selected"); }}

Wednesday, November 23, 11

Page 25: Devon 2011-f-4-improve your-javascript

L∞p

Wednesday, November 23, 11

Page 26: Devon 2011-f-4-improve your-javascript

for (var i = 0; i < items.length; i++) { process(items[i]);}

Wednesday, November 23, 11

Page 27: Devon 2011-f-4-improve your-javascript

var k = items.length - 1;do { process(items[k]);} while (k--);

Wednesday, November 23, 11

Page 28: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 29: Devon 2011-f-4-improve your-javascript

Scope Chain

Nested Member

Loop

Wednesday, November 23, 11

Page 30: Devon 2011-f-4-improve your-javascript

Scope Chain

Nested Member

Loop

Wednesday, November 23, 11

Page 31: Devon 2011-f-4-improve your-javascript

Scope Chain

Nested Member

Loop

FAIL

Wednesday, November 23, 11

Page 32: Devon 2011-f-4-improve your-javascript

Real World Bottleneck

Wednesday, November 23, 11

Page 33: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 34: Devon 2011-f-4-improve your-javascript

DOM

Reflow

UI Thread

Wednesday, November 23, 11

Page 35: Devon 2011-f-4-improve your-javascript

Daum Top DOM visualization - http://www.aharef.info/static/htmlgraph/

Wednesday, November 23, 11

Page 36: Devon 2011-f-4-improve your-javascript

DOM

Daum Top DOM visualization - http://www.aharef.info/static/htmlgraph/

Wednesday, November 23, 11

Page 37: Devon 2011-f-4-improve your-javascript

‘The Document Object Model (DOM) is an application programming interface (API) for

HTML and XML documents’

Wednesday, November 23, 11

Page 38: Devon 2011-f-4-improve your-javascript

‘The Document Object Model (DOM) is an application programming interface (API) for

HTML and XML documents’

Wednesday, November 23, 11

Page 39: Devon 2011-f-4-improve your-javascript

DOM is not part of javascript engine

Javascript Engine DOM Engine

JScript (jscript.dll) Trident (mshtml.dll)

Nitro WebCore

V8 WebCore

TraceMonkey Gecko

Wednesday, November 23, 11

Page 40: Devon 2011-f-4-improve your-javascript

‘Give����������� ������������������  me����������� ������������������  your����������� ������������������  money’

Wednesday, November 23, 11

Page 41: Devon 2011-f-4-improve your-javascript

DOM is ExpensiveMinimize DOM AccessAvoid HTMLCollection

Wednesday, November 23, 11

Page 42: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 43: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 44: Devon 2011-f-4-improve your-javascript

Reflow

Wednesday, November 23, 11

Page 45: Devon 2011-f-4-improve your-javascript

UI Updates = Reflow + Repaint

Wednesday, November 23, 11

Page 46: Devon 2011-f-4-improve your-javascript

Parsing HTML to construct the

DOM tree

Render treeconstruction

Layout of the render tree

Painting the render tree

Wednesday, November 23, 11

Page 47: Devon 2011-f-4-improve your-javascript

Parsing HTML to construct the

DOM tree

Render treeconstruction

Layout of the render tree

Painting the render tree

Wednesday, November 23, 11

Page 48: Devon 2011-f-4-improve your-javascript

Parsing HTML to construct the

DOM tree

Render treeconstruction

Layout of the render tree

Painting the render tree

{ width, height, x, y }

{ width, height, x, y }

{ width, height, x, y }

{ width, height, x, y }

{ width, height, x, y }

{ width, height, x, y }

Wednesday, November 23, 11

Page 49: Devon 2011-f-4-improve your-javascript

Parsing HTML to construct the

DOM tree

Render treeconstruction

Layout of the render tree

Painting the render tree

Wednesday, November 23, 11

Page 50: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 51: Devon 2011-f-4-improve your-javascript

Causing Reflow

Page renders initially

Window is resized

Visible DOM elements are added or removed

Element change position

Element change size

margin, padding, border, width, height

text changes, image replaced with different size

Wednesday, November 23, 11

Page 52: Devon 2011-f-4-improve your-javascript

Reflow is ExpensiveBatch Style Changes

Use Flow-Off TechniqueAvoid Geometry Access

Wednesday, November 23, 11

Page 53: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 54: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 55: Devon 2011-f-4-improve your-javascript

UI Thread

Wednesday, November 23, 11

Page 56: Devon 2011-f-4-improve your-javascript

UI Thread

Draw UI Updates

Execute Javascript

Wednesday, November 23, 11

Page 57: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 58: Devon 2011-f-4-improve your-javascript

Only one job can happen at a time

Wednesday, November 23, 11

Page 59: Devon 2011-f-4-improve your-javascript

Jobs for UI Updates and Javascript Execution are added to a UI Queue

Wednesday, November 23, 11

Page 60: Devon 2011-f-4-improve your-javascript

button.addEventListener("click", function handleClick() { doHeavyJob(); resultDIV.innerHTML = "Finish!";});

Wednesday, November 23, 11

Page 61: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

Wednesday, November 23, 11

Page 62: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

UI UpdateButton

JavascripthandleClick()

Wednesday, November 23, 11

Page 63: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

UI UpdateButton

JavascripthandleClick()

JavascripthandleClick()

Wednesday, November 23, 11

Page 64: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

UI UpdateButton

JavascripthandleClick()

JavascripthandleClick()

Wednesday, November 23, 11

Page 65: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

UI UpdateButton

JavascripthandleClick()

JavascripthandleClick()

User clicks

UI UpdateButton

JavascriptotherLogic()

Wednesday, November 23, 11

Page 66: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

UI UpdateButton

JavascripthandleClick()

JavascripthandleClick()

User clicks

UI UpdateButton

JavascripthandleClick()

User clicks

UI Update

Javascript

UI Update

Javascript

Wednesday, November 23, 11

Page 67: Devon 2011-f-4-improve your-javascript

UI UpdateButton

UI Thread

UI QueueUser clicks

Time

JavascripthandleClick()

UI UpdateButton

JavascripthandleClick()

JavascripthandleClick()

User clicks

UI UpdateButton

JavascripthandleClick()

User clicks

UI Update

Javascript

UI Update

Javascript

UI Update

Javascript

UI Update

User clicksUser clicksUser clicksUser clicks

Wednesday, November 23, 11

Page 68: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 69: Devon 2011-f-4-improve your-javascript

One Second

“Javascript that executes in whole seconds is probably doing something wrong...”

- Brendan Eich, Creator of Javascript

Wednesday, November 23, 11

Page 70: Devon 2011-f-4-improve your-javascript

How Long Is Too Long?

“0.1 second is about the limit for having the user feel that the system is reacting instantaneously, meaning that no special feedback is necessary except to display the result.”

- Jakob Nielsen, 1968

Wednesday, November 23, 11

Page 71: Devon 2011-f-4-improve your-javascript

Yield control to UI Update

Wednesday, November 23, 11

Page 72: Devon 2011-f-4-improve your-javascript

Yielding with Timers

Wednesday, November 23, 11

Page 73: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 74: Devon 2011-f-4-improve your-javascript

Wednesday, November 23, 11

Page 75: Devon 2011-f-4-improve your-javascript

Conclusion

Wednesday, November 23, 11

Page 76: Devon 2011-f-4-improve your-javascript

1. Digg the low level JS Perf. characteristicsBut, premature optimization is evil

Wednesday, November 23, 11

Page 77: Devon 2011-f-4-improve your-javascript

DOM

Reflow

UI Thread

2. Don’t touch the SLOW PART!

Wednesday, November 23, 11

Page 78: Devon 2011-f-4-improve your-javascript

Make the Web FasterMake the Web Responsive

Wednesday, November 23, 11

Page 79: Devon 2011-f-4-improve your-javascript

Thank You

Wednesday, November 23, 11