javascript front end performance optimizations

84
JavaScript Front-End Performance Optimizations Northeast JavaScript Conference LOVE2DEV.CO M

Upload: chris-love

Post on 16-Apr-2017

518 views

Category:

Internet


0 download

TRANSCRIPT

Page 1: JavaScript front end performance optimizations

JavaScript Front-End Performance Optimizations

Northeast JavaScript Conference

LOVE2DEV.COM

Page 2: JavaScript front end performance optimizations

My BioMicrosoft MVPASP Insider Edge User AgentWeb Developer 25 yearsAuthor & Speaker

@ChrisLoveLove2Dev.com

Page 3: JavaScript front end performance optimizations

Source Codehttp://

GitHub.com/docluv

Slide Deck http://slideshare.net/docluv/presentations

Page 4: JavaScript front end performance optimizations

10 Days to HTML5 Fitness

http://bit.ly/2ctJMiU

Page 5: JavaScript front end performance optimizations
Page 6: JavaScript front end performance optimizations

Annoying???

Page 7: JavaScript front end performance optimizations

LOVE2DEV.COM

"Also take a step back for a minute and consider the intent of this change: a faster web is great for everyone, but especially for users. Lots of websites have demonstrated that speeding up the user experience results in more usage. So speeding up your website isn’t just something that can affect your search rankings–it’s a fantastic idea for your users.“

http://bit.ly/SPPB4k

Matt Cutts

Page 8: JavaScript front end performance optimizations

LOVE2DEV.COM

GOALSWeb Trends & Some HistoryFront-End Architecture Best PracticesCoding SyntaxNavigation & Performance Timing APIBuild & Deploy

Page 9: JavaScript front end performance optimizations

Web Trends & History

LOVE2DEV.COM

Page 10: JavaScript front end performance optimizations

6 Years of JS Weight Gain

Page 11: JavaScript front end performance optimizations

The Reach of JavaScript ExpandedWeb Applications/SPAs

HTML5 GamesBasic Web Pages

JavaScript Execution Speed

DOM InteractionsAccelerated Graphics

Page Load Time

Page 12: JavaScript front end performance optimizations

Conference Sponsor Sites Performance

LOVE2DEV.COM

Page 13: JavaScript front end performance optimizations

Conference Sponsor Sites Averages

LOVE2DEV.COM

•Document Complete 6.94s• Fully Loaded 8.7s• Page Weight 2.8MB• JS Weight 788kb

Page 14: JavaScript front end performance optimizations

Web Sites Are Obese & Out of Shape

http://httpArchive.org as of 5/15/2016

117 File Requests – 2.4+MB23 JavaScript Files - 401KB7.1 CSS Files – 74KB56 Images – 1.577MB36 TCP Connections19 Domains48% Cacheable

Page 15: JavaScript front end performance optimizations

Is JavaScript the Problem?

Page 16: JavaScript front end performance optimizations
Page 17: JavaScript front end performance optimizations

YUI

  TotalSize (k)

NumberElements

CSSRules

ImageFiles

ScriptLines (F)

ScriptLibraries

Site #1 3,697 1,504 1,392 41 77,768

Site #2 2,278 1,100 5,325 29 39,183

Site #3 1,061 2,673 1,105 66 12,643

Site #4 1,812 4,252 1,672 12 10,284

Site #5 1,372 900 3,902 6 38,269

jQuery Prototype ExtJS OtherScriptaculous

Page 18: JavaScript front end performance optimizations

YUI

  TotalSize (k)

NumberElements

CSSRules

ImageFiles

ScriptLines (F)

ScriptLibraries

Site #1 3,697 1,504 1,392 41 77,768

Site #2 2,278 1,100 5,325 29 39,183

Site #3 1,061 2,673 1,105 66 12,643

Site #4 1,812 4,252 1,672 12 10,284

Site #5 1,372 900 3,902 6 38,269

jQuery Prototype ExtJS OtherScriptaculous

Fastest

Page 19: JavaScript front end performance optimizations

YUI

  TotalSize (k)

NumberElements

CSSRules

ImageFiles

ScriptLines (F)

ScriptLibraries

Site #1 3,697 1,504 1,392 41 77,768

Site #2 2,278 1,100 5,325 29 39,183

Site #3 1,061 2,673 1,105 66 12,643

Site #4 1,812 4,252 1,672 12 10,284

Site #5 1,372 900 3,902 6 38,269

jQuery Prototype ExtJS OtherScriptaculous

Slowest

Page 20: JavaScript front end performance optimizations

Is JavaScript the Problem?• Bytes Must Be Downloaded• Bytes Cost Real Money• 25% of US Exceeds Monthly Bandwidth

• Bytes Take Time• Scripts Must Be Evaluated• Libraries Can Overwrite Native APIs or Don’t Use Native APIs

LOVE2DEV.COM

Page 21: JavaScript front end performance optimizations

Don’t Guess•Use Profiling Tools• Establish Benchmarks• < 1s Desktop/Broadband• < 3s Mobile/GPRS

• Test On Real Devices Against ‘Real Site’• Have a 2G Day

• Apply Scientific Method to Solve Problems

LOVE2DEV.COM

Page 22: JavaScript front end performance optimizations

Establish a Performance Culture

• Make Perforamance a 1st Class Citizen of Your Team• Include Developers, Architects, QA &

Stakeholders• Etsy Quarterly Performance Reports

• https://codeascraft.com/2016/04/28/q1-2016-site-performance-report/

• Designing For Performance• http://amzn.to/2d30GRy

Page 23: JavaScript front end performance optimizations

Don’t Assume Broadband

Page 24: JavaScript front end performance optimizations

What Does Your Site Cost?

http://whatdoesmysitecost.com

Page 25: JavaScript front end performance optimizations

Power Consumption

Page 26: JavaScript front end performance optimizations

Real & Perceived Performance

Page 27: JavaScript front end performance optimizations

Architecture Best Practices

LOVE2DEV.COM

Page 28: JavaScript front end performance optimizations

Place Script References At The Bottom• SCRIPT is a Blocking Action• Allow Browser to Render As Much As Possible Before Evaluating & Executing Scripts

Page 29: JavaScript front end performance optimizations

JS Parse & Execution Time• Scripts Must Be Downloaded• Scripts Must Be Evaluated•Majority of Traffic from Mobile Class Devices• Lower Powered CPU• Less Memory

• Etsy Tool• https://timkadlec.com/2014/09/js-parse-and-execution-time/

Page 30: JavaScript front end performance optimizations
Page 31: JavaScript front end performance optimizations

Best Practice• Ask If Script/Library/Framework Is Really Needed• Are Their Alternatives?• Strive to Use Libraries Components That Do What Needs to be Done

Page 32: JavaScript front end performance optimizations

Best Practice – Libraries & Frameworks•Use A Single Library• Keep Library Up To Date• Avoid Duplicate References• Avoid Duplicate Versions

Page 33: JavaScript front end performance optimizations

Avoid Duplicate Code<html><head><title>Test</title></head><body>…<script src="jquery.js" … ></script><script src="myscript.js" … ></script> <script src="navigation.js" … ></script><script src="jquery.js" … ></script></body>

</html>

Page 34: JavaScript front end performance optimizations

Avoid Duplicate Code

52%of the pages on the web

have duplicate code

Page 35: JavaScript front end performance optimizations

Standardize on Single Library/Framework<script src="jquery.js" … ></script><script src="prototype.js" … ></script><script src="dojo.js" … ></script><script src="animater.js" … ></script><script src="extjs.js" … ></script><script src="yahooui.js" … ></script><script src="mochikit.js" … ></script><script src="lightbox.js" … ></script><script src="jslibs.js" … ></script><script src=“gsel.js" … ></script>…

Page 36: JavaScript front end performance optimizations

ASP.NET Web Client Library

Prototype

jQuery/jQueryUI

Ember

Angular

React

Page 37: JavaScript front end performance optimizations

Ask If It Is Needed• Avoid Framework Archeology•Don’t Use a Library/Framework to be Cool • Resume Driven Development

• Remember the Goal is to Make the Customer Happy• They Pay the Bills!

•Majority of Pages/Sites are Still Read-Only

Page 38: JavaScript front end performance optimizations

Use Async & Defer• Allows Browser to Finish Rendering Cycle•Use When Script Order is not important•Use When Script is not needed to render

Page 39: JavaScript front end performance optimizations

Audit 3rd Parties

Page 40: JavaScript front end performance optimizations

3rd Parties•Often Added By Marketing Departments•Use of Tag Managers•Many Are Not Used by Stakeholders•Not Part of Application/Site Q/A•Not Managed By DevOps•Not Held to SLA

LOVE2DEV.COM

Page 41: JavaScript front end performance optimizations

3rd Parties• You Are Outsourcing Control Of Your Business To A Supplier You Have Little or No Control• They Can & Do Have A Big Impact On Your Brand Image and Engagment

LOVE2DEV.COM

Page 42: JavaScript front end performance optimizations

DOM Interactions• Built In DOM Methods More Efficient• Avoid Type Conversion• Avoid DOM Chatiness

LOVE2DEV.COM

Page 43: JavaScript front end performance optimizations

DOM Methods More Efficient• querySelector• querySelectorAll• firstElementChild• nextElementSibling• previousElementSibling• lastElementChild• childElementCount

LOVE2DEV.COM

Page 44: JavaScript front end performance optimizations

function InsertUsername(){

document.getElementById('user').innerHTML = userName;}

User .innerHTML to Construct Your PageUse DOM Efficiently

Page 45: JavaScript front end performance optimizations

function InsertUsername(){

document.getElementById('user').innerHTML = userName;}

User .innerHTML to Construct Your PageUse DOM Efficiently

Page 46: JavaScript front end performance optimizations

function BuildUI() { var elm = document.getElementById('ui'); var contents = BuildTitle() + BuildBody() + BuildFooter(); elm.innerHTML = contents;}

Batch Markup ChangesUse DOM Efficiently

Page 47: JavaScript front end performance optimizations

function BuildUI() { var elm = document.getElementById('ui'); var contents = BuildTitle() + BuildBody() + BuildFooter(); elm.innerHTML = contents;}

Batch Markup ChangesUse DOM Efficiently

Page 48: JavaScript front end performance optimizations

function BuildUI() { var elm = document.getElementById('ui'); var contents = BuildTitle() + BuildBody() + BuildFooter(); elm.innerHTML = contents;}

Batch Markup ChangesUse DOM Efficiently

Page 49: JavaScript front end performance optimizations

function BuildUI() { var elm = document.getElementById('ui'); var contents = BuildTitle() + BuildBody() + BuildFooter(); elm.innerHTML = contents;}

Batch Markup ChangesUse DOM Efficiently

Page 50: JavaScript front end performance optimizations

Small Healthy DOM

LOVE2DEV.COM

Page 51: JavaScript front end performance optimizations

Use DOM Methods to Create Collections

LOVE2DEV.COM

Page 52: JavaScript front end performance optimizations

Use DOM Selectors Collection Access

LOVE2DEV.COM

Page 53: JavaScript front end performance optimizations

Avoid DOM Type Conversion

Page 54: JavaScript front end performance optimizations

Avoid DOM Chatiness

Page 55: JavaScript front end performance optimizations

Performance•UI Responsiveness• Identify CPU Intensive Code• Identify Frame Rate Issues

• JavaScript Profiling• Identify Code Bottlenecks

LOVE2DEV.COM

Page 56: JavaScript front end performance optimizations

Memory Profiling

Page 57: JavaScript front end performance optimizations

Memory Profiling• Timeline to Identify Memory Pressure Issues• Track Down Memory Leaks

LOVE2DEV.COM

Page 58: JavaScript front end performance optimizations

Memory Utilization

Page 59: JavaScript front end performance optimizations

Memory Leaks

Page 60: JavaScript front end performance optimizations

Memory Leaks

Page 61: JavaScript front end performance optimizations

Memory Leaks

Page 62: JavaScript front end performance optimizations

Array Best Practices• Pre-Allocate• Keep Array Type Consistent•Use Typed Arrays• Keep Arrays Dense• Enumerate Efficiently

LOVE2DEV.COM

Page 63: JavaScript front end performance optimizations

Use Typed Arrays

LOVE2DEV.COM

Page 64: JavaScript front end performance optimizations

Sparse vs Dense Arrays• Arrays are Sparse, they have holes in them• A map from indices to values

LOVE2DEV.COM

Page 65: JavaScript front end performance optimizations

Sparse vs Dense Arraysvar a = new Array(3);

a [ , , ];

a.length === 3 a[0] === undefined

a.map(function (x, i) { return i }) === [ , , ]

LOVE2DEV.COM

Page 66: JavaScript front end performance optimizations

Sparse vs Dense Arrays• Array(undefined, undefined, undefined)

• a.map(function (x, i) { return i }) === [ 0, 1, 2 ]

LOVE2DEV.COM

Page 67: JavaScript front end performance optimizations

Keep Arrays Dense

LOVE2DEV.COM

Page 68: JavaScript front end performance optimizations

Enumerate Arrays Efficently

LOVE2DEV.COM

Page 69: JavaScript front end performance optimizations

Don’t do useless work

setInterval(draw, 0);setTimeout(draw, 0);requestAnimationFrame(draw);setTimeout(draw, 1000 / 60);

Page 70: JavaScript front end performance optimizations

Do avoid chattiness with the DOM

JavaScript

DOM

for (var i = 0; i < this.nOfBubbles; i++) { document.body.box.getElementById("ball0").style.left = b.x + "px"; document.body.box.getElementById("ball0").style.top = b.y + "px";}

Page 71: JavaScript front end performance optimizations

Do check types of values from DOMthis.nOfBubbles =

document.getElementById(“dropDown").value;

30%of rendering time in string conversion

Slow Operations

11%Value

Conversions 18%

GC 17%

Your Code 45%

Page 72: JavaScript front end performance optimizations

JavaScript: Flexibility or performance

Flexibility Performance

“Think C++”“Think Script”

Simple Websites Complex Apps, Games

var r = 3 * "10"; // r == 300

var a = new Array();a.push(10);

var p = {x: 0, y: 0};p.z = 5;p["some text"] = 1;p[1] = 2;eval("var s = p[1] * a[0]"); // s == 20

var r = 3 * parseInt("10");

var a = new Array(100);a[0] = 10;

var p = new Point(0, 0, 0);p.z = 5;

Page 73: JavaScript front end performance optimizations

• C, C++, C# (Static Language)

• static int DoMath(int value) {• int result = 0;• for (int i = 0; i < 10000; i++) {

• for (int j = 0; j < 10000; j++) {

• result = i + j + value;

• }• }• return result;• }

JavaScript (Dynamic Language)function DoMath(value) { for (var i = 0; i < 10000; i++) { for (var j = 0; j < 10000; j++) { var result = i + j + value; } } return result;}

Stick to Integer MathWrite Fast JavaScript

Page 74: JavaScript front end performance optimizations

Stick to Integer MathWrite Fast JavaScript

C++ JavaScriptDoMath(999);

40ms200ms (~5x)

DoMath(999/2);40ms

1600ms (~40x)

Page 75: JavaScript front end performance optimizations

Stick to Integer MathWrite Fast JavaScript

0x005e22a0Pointer01 Type Tag449.4999999……… Value

02 Type Tag

“Hello World”Value

0x005e4148Pointer

Page 76: JavaScript front end performance optimizations

Stick to Integer MathWrite Fast JavaScript

DoMath(Math.floor(999 / 2));

var b = Math.ceil((p[i].r + p[i].g + p[i].b) / 3);

Page 77: JavaScript front end performance optimizations

Stick to Integer MathWrite Fast JavaScript

DoMath(Math.floor(999 / 2));

var b = Math.ceil((p[i].r + p[i].g + p[i].b) / 3);

Page 78: JavaScript front end performance optimizations

Stick to Integer MathWrite Fast JavaScript

DoMath(Math.floor(999 / 2));

var b = Math.ceil((p[i].r + p[i].g + p[i].b) / 3);

Page 79: JavaScript front end performance optimizations

Do write fast objects Add all properties in constructor Don’t delete properties Use identifiers for property names Use getters and setters sparingly Avoid conditionally adding properties Avoid default property values on prototype objects

Page 80: JavaScript front end performance optimizations

Navigation & Performance Timing APIs Give You Access to Real Times Various Stages of Document Lifecycle

https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API http://www.html5rocks.com/en/tutorials/webperformance/basics/

Page 81: JavaScript front end performance optimizations

Navigation & Performance Timing APIs

Page 82: JavaScript front end performance optimizations

How to Build JavaScript Maintain Development, QA, Production Versions Use a Build Tool

Grunt, Gulp, WebPac, Broccoli, Node, etc

Page 83: JavaScript front end performance optimizations

How to Build Production JavaScript Bundle & Minify

A Single Request is much faster to download and parse Compress

Gzip Content-Encoding Header

Set Proper Cache Headers CacheControl: "public, max-age=31449600, s-max-age=360“

Use A CDN Host on Static Server

Page 84: JavaScript front end performance optimizations

How to Build Production JavaScript Node Modules Exists to Automate All these Requirements

Set it and Forget It!