79
JavaScript Performance Q.pictures / pixelio.de

Von 0 auf 100 - Performance im Web

Embed Size (px)

Citation preview

Page 1: Von 0 auf 100 - Performance im Web

JavaScript Performance

Q.pictures / pixelio.de

Page 2: Von 0 auf 100 - Performance im Web

Guten Morgen!!!

Page 3: Von 0 auf 100 - Performance im Web

Sebastian• Sebastian Springer

• aus München

• arbeite bei MaibornWolff GmbH

• https://github.com/sspringer82

• @basti_springer

• JavaScript Entwickler

Page 4: Von 0 auf 100 - Performance im Web

IT-Beratung & Software Engineering

Page 5: Von 0 auf 100 - Performance im Web

Wie mache ich meine Applikation

Margot Kessler / pixelio.de

schneller

Page 6: Von 0 auf 100 - Performance im Web

Eigene Optimierung

Tim Reckmann / pixelio.de

Page 7: Von 0 auf 100 - Performance im Web

Caching von Werten

let arr = ['Peter', 'Paul', 'Mary']; for (let i = 0; i < arr.length; i++) { console.log(arr[i]);} // 1.734mslet arr = ['Peter', 'Paul', 'Mary']; for (let i = 0, j = arr.length; i < j; i++) { console.log(arr[i]);} // 1.699ms

Page 8: Von 0 auf 100 - Performance im Web

Optimierung der EngineDieter Schütz / pixelio.de

Page 9: Von 0 auf 100 - Performance im Web

Engine Optimierung

let arr = ['Peter', 'Paul', 'Mary']; for (let i = 0; i < arr.length; i++) { console.log(arr[i]);} // 1.734msfor (let i = 0; i < arr.length; i++) { console.log(arr[i]);} // 0.079ms

Bei einem zweiten Durchlauf

Page 10: Von 0 auf 100 - Performance im Web

Optimierung

Die Optimierung von JavaScript-Quellcode ist nicht euer Problem! Die meiste Arbeit nimmt euch hier die Engine ab.

Die Optimierung des Quellcodes bringt relativ wenig und geht meistens auf Kosten der Lesbarkeit.

Also: Das Big Picture im Auge behalten!

Page 11: Von 0 auf 100 - Performance im Web

Was zählt?

Die Zeit bis der Nutzer die ersten Informationen sieht und mit der Seite

interagieren kann.

Page 12: Von 0 auf 100 - Performance im Web

Critical Rendering Path

Thorben Wengert / pixelio.de

Page 13: Von 0 auf 100 - Performance im Web

Critical Rendering Path

Der Prozess zwischen dem Empfang der HTML-, CSS- und JavaScript-Dateien und der Darstellung der Information im

Browser.

Page 14: Von 0 auf 100 - Performance im Web
Page 15: Von 0 auf 100 - Performance im Web
Page 16: Von 0 auf 100 - Performance im Web

Critical Rendering Path

1. HTML Verarbeitung -> DOM

2. CSS Verarbeitung -> CSSOM

3. Render Tree Erzeugung

4. Darstellung

Page 17: Von 0 auf 100 - Performance im Web

HTML Verarbeitung

https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model

https://creativecommons.org/licenses/by/3.0/

Page 18: Von 0 auf 100 - Performance im Web

CSS Verarbeitung

https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model

https://creativecommons.org/licenses/by/3.0/

Page 19: Von 0 auf 100 - Performance im Web

Render Tree

https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model

https://creativecommons.org/licenses/by/3.0/

Page 20: Von 0 auf 100 - Performance im Web

Messung

Page 21: Von 0 auf 100 - Performance im Web

Download

Karl-Heinz Laube / pixelio.de

Page 22: Von 0 auf 100 - Performance im Web

Download von Dateien

Ein Browser hat nur eine beschränkte Anzahl von parallelen Verbindungen zu einem Server.

Firefox: 6 Chrome: 6

Internet Explorer: 13

Page 23: Von 0 auf 100 - Performance im Web

Download - Lösung

Möglichst wenige, möglichst kleine Dateien ausliefern.

CSS: Präprozessoren + Minifier JS: Modulsystem + Minifier

Images: Sprites

Page 24: Von 0 auf 100 - Performance im Web

Download

Page 25: Von 0 auf 100 - Performance im Web

Service Worker

Page 26: Von 0 auf 100 - Performance im Web

Service Worker

Service Worker sind separate Prozesse im Browser, die als Proxy zwischen Client und Server arbeiten. Sie können

Anfragen abfangen und aus ihrem Cache direkt beantworten. Web-Applikationen werden damit wesentlich schneller und

können auch offline genutzt werden.

Page 27: Von 0 auf 100 - Performance im Web

Service Worker

Page 28: Von 0 auf 100 - Performance im Web

Blockaden

lichtkunst.73 / pixelio.de

Page 29: Von 0 auf 100 - Performance im Web

Render Blocking CSS

Jede CSS-Datei blockiert die Darstellung der Seite für kurze Zeit.

Je mehr CSS verwendet wird, desto länger dauert die Blockade.

Page 30: Von 0 auf 100 - Performance im Web

Render Blocking CSS

Kein @import verwenden - lieber alles in eine Datei.

Weniger CSS im Critical Rendering Path verwenden, z.B. media-Attribut im style-Tag.

Wenn sonst nichts hilft: Inline CSS.

Page 31: Von 0 auf 100 - Performance im Web

Render Blocking JavaScript

Alles JavaScript, das nicht direkt zum initialen Pageload benötigt wird, kann nachgeladen werden.

Z.B. über ein generiertes Script-Tag beim load-Event.

oder lazy loading Funktionalität des Modulloaders (z.B. webpack)

Page 32: Von 0 auf 100 - Performance im Web

App Shell Architecture

Minimales HTML, CSS und JavaScript als Grundlage für das User Interface.

• lädt schnell • kann gecacht werden • zeigt dynamischen Inhalt an

Page 33: Von 0 auf 100 - Performance im Web

Single Page-Applikationen

Tim Reckmann / pixelio.de

Page 34: Von 0 auf 100 - Performance im Web

Der Benutzer bewegt sich in einer Applikation. Die Applikation bleibt über längere Zeit im Browser geöffnet.

Daten werden bei Bedarf nachgeladen.

Es erfolgen keine Pageloads.

Page 35: Von 0 auf 100 - Performance im Web

Der State der Applikation wird im Speicher gehalten.

Die Repräsentationen vieler Objekte liegen im Speicher.

Der Speicherverbrauch steigt über die Laufzeit an.

Page 36: Von 0 auf 100 - Performance im Web

JavaScript Engines

Rudolpho Duba / pixelio.de

Page 37: Von 0 auf 100 - Performance im Web

JavaScript Engines

Der Wettbewerb zwischen den Browserherstellern hat einige hoch optimierte Engines hervorgebracht.

Page 38: Von 0 auf 100 - Performance im Web

JavaScript Engines

• Google Chrome: V8

• Mozilla Firefox: SpiderMonkey

• Microsoft Internet Explorer: Chakra

• Apple Safari: Nitro

Page 39: Von 0 auf 100 - Performance im Web

Beispiel: V8

V8 is a JavaScript engine specifically designed for fast execution of large JavaScript applications.

Page 40: Von 0 auf 100 - Performance im Web

Hidden Classes

Bernd Kasper / pixelio.de

Page 41: Von 0 auf 100 - Performance im Web

Hidden Classes

Um den Zugriff auf Eigenschaften zu beschleunigen, wird nicht ein Verzeichnis mit allen Eigenschaften verwendet,

sondern pro Objekt Hidden Classes erzeugt, die auf den korrekten Speicherpunkt verweisen.

Page 42: Von 0 auf 100 - Performance im Web

function Point(x, y) { this.x = x; this.y = y;} var p1 = new Point(2, 4);

Page 43: Von 0 auf 100 - Performance im Web

function Point(x, y) { this.x = x; this.y = y;} var p1 = new Point(2, 4);

p1

Hidden Class C0

Page 44: Von 0 auf 100 - Performance im Web

function Point(x, y) { this.x = x; this.y = y;} var p1 = new Point(2, 4);

p1

Hidden Class C0

x: offset 0

Hidden Class C0 Wird Eigenschaft x hinzugefügt,

verwende C1.

Page 45: Von 0 auf 100 - Performance im Web

Hidden Class C1

x: offset 0

function Point(x, y) { this.x = x; this.y = y;} var p1 = new Point(2, 4);

p1

Hidden Class C2

x: offset 0 y: offset 1

Hidden Class C0

Wird Eigenschaft y hinzugefügt, verwende C2.

Page 46: Von 0 auf 100 - Performance im Web

Hidden Classes

Weitere Objekte vom selben Typ verwenden die gleichen Hidden Classes und deren Übergänge.

Page 47: Von 0 auf 100 - Performance im Web

JIT Compiler

Page 48: Von 0 auf 100 - Performance im Web

JIT Compiler

V8 kompiliert JavaScript bei der ersten Ausführung in Maschinencode.

Die passenden Hidden Classes werden bestimmt und der Code entsprechend gepatcht. Auch alle zukünftigen

Verwendungen des Objekts werden mit der Hidden Class versehen und bei Bedarf von der Engine korrigiert.

Page 49: Von 0 auf 100 - Performance im Web

JIT Compiler

# ebx = the point object cmp [ebx,<hidden class offset>],<cached hidden class> jne <inline cache miss> mov eax,[ebx, <cached x offset>]

p1.x

Page 50: Von 0 auf 100 - Performance im Web

Garbage Collection

Moni Sertel / pixelio.de

Page 51: Von 0 auf 100 - Performance im Web

Garbage Collection

V8 verschiebt das Memory Management möglichst in ungenutzte Idle Time des Prozessors, um den Impact auf die

Darstellung zu minimieren.

Der Garbage Collector prüft regelmäßig den belegten Speicher und löscht nicht mehr verwendete Informationen.

Nicht mehr verwendet heißt: keine Referenz mehr auf ein Objekt.

Page 52: Von 0 auf 100 - Performance im Web

Garbage Collection

neu zugewiesener Speicher

langlebige Objekte

Speicheraufteilung:

Die meisten Objekte haben nur eine sehr kurze Lebensspanne.

young generation

old generation

Page 53: Von 0 auf 100 - Performance im Web

neu zugewiesener Speicher

Garbage CollectionObjekt1

Objekt2Objekt3

Objekt1

Objekt2Objekt3

langlebige Objekte

Objekt1

Sobald ein Speicherblock voll ist, werden die verwendeten Objekte verschoben, der Speicher dann gelöscht. Beim zweiten Verschieben wird

das Objekt in den old Generation Space verschoben.

Page 54: Von 0 auf 100 - Performance im Web

Garbage Collection

Je weniger Objekte verschoben werden müssen, desto schneller ist die young generation Garbage Collection.

Page 55: Von 0 auf 100 - Performance im Web

Garbage CollectionÜberschreitet der old generation space ein bestimmtes Limit,

wird der Bereich mit einem mark-and-sweep Collector aufgeräumt.

Aktive Objekte werden markiert und anschließend alle nicht markierten Objekte gelöscht.

Ein kompletter Durchlauf kann 100 ms dauern. Die Applikation wird in dieser Zeit angehalten.

V8 kann diesen Prozess auch inkrementell in 5 ms-Schritten durchführen.

Page 56: Von 0 auf 100 - Performance im Web

JavaScript Engines

Also:

Werden Strukturen mehrmals verwendet, greifen viele Optimierungen der Engine.

Page 57: Von 0 auf 100 - Performance im Web

Repaints & Reflows

Tim Reckmann / pixelio.de

Page 58: Von 0 auf 100 - Performance im Web

Repaints & Reflows

Repaint: Der Browser überprüft alle Elemente auf ihre Sichtbarkeit, Farbe, Abmessungen und andere visuelle Eigenschaften und aktualisiert die relevanten Teile des

Bildschirms.

Page 59: Von 0 auf 100 - Performance im Web

Repaints & Reflows

Reflow: Der Browser berechnet das Layout der Seite. Reflows für weitere Elemente können ausgelöst werden

(Kinder, benachbarte Elemente, im DOM folgende Elemente). Danach wird ein Repaint ausgelöst.

Page 60: Von 0 auf 100 - Performance im Web

Auslöser für Reflows• Einfügen, Entfernen oder Aktualisieren eines DOM Elements

• Verändern des Inhalts einer Seite

• Verschieben eines Elements

• Animationen

• Abmessungen auslesen

• CSS-Eigenschaften ändern

• Klassennamen eines Elements ändern

• Stylesheet hinzufügen oder entfernen

• Fenstergröße ändern

• Scrollen

Page 61: Von 0 auf 100 - Performance im Web

Vermeiden von Reflows• Folgen von einzelnen Styleänderungen vermeiden

• Operationen über Klassennamen zusammenfassen

• Operationen außerhalb des DOMs durchführen und danach einhängen

• Styles in Variablen cachen

• Für Animationen besser fixe Positionierung wählen

Page 62: Von 0 auf 100 - Performance im Web

Profiling

Rendering: Layoutberechnungen

Painting: Darstellung der Seite

Page 63: Von 0 auf 100 - Performance im Web

Memory Leaks

detlef menzel / pixelio.de

Page 64: Von 0 auf 100 - Performance im Web

Memory Leaks

Machen unsere Applikationen langsam, führen zu Abstürzen und hohen Latenzen.

Ein Memory Leak tritt auf, wenn Speicher nicht mehr gebraucht wird, aber nicht zur Garbage Collection

freigegeben wird.

Page 65: Von 0 auf 100 - Performance im Web

Memory Leaks

Globale Variablen

Vergessene Intervalle

DOM-Knoten in Datenstrukturen

Closures

Page 66: Von 0 auf 100 - Performance im Web

Memory Leaksvar theThing = null; var replaceThing = function () { var originalThing = theThing; var unused = function () { if (originalThing) console.log("hi"); }; theThing = { longStr: new Array(1000000).join('*'), someMethod: function () { console.log(someMessage); } };}; setInterval(replaceThing, 100);

http://info.meteor.com/blog/an-interesting-kind-of-javascript-memory-leak

Page 67: Von 0 auf 100 - Performance im Web

Memory Leaks

Memory läuft langsam voll

Page 68: Von 0 auf 100 - Performance im Web

Animationen

Tim Reckmann / pixelio.de

Page 69: Von 0 auf 100 - Performance im Web

JavaScript Animationen

Bei einer Animation wird nach einer bestimmten Zeit eine CSS-Eigenschaft eines Objekts verändert. Ist die gewählte

Zeitspanne gering genug, entsteht eine mehr oder weniger flüssige Animation.

Page 70: Von 0 auf 100 - Performance im Web

function move(elem, to) { var left = 0; function frame() { left++; elem.style.left = left + 'px'; if (left === to) { clearInterval(id) } } var id = setInterval(frame, 10); } document.getElementById('outer').onclick = function () { move(this.children[0], 500);};

<div id="outer" class="outer"> <div id="inner" class="inner"></div> </div>

HTML

CSS

Page 71: Von 0 auf 100 - Performance im Web

Nachteile

JavaScript wird über die CPU ausgeführt. Muss sich also die Ressourcen mit vielen anderen Programmen teilen.

GC-Cycles können zu unschönen Effekten führen, da die Ausführung angehalten wird.

Bei hoher CPU-Last sind die Animationen nicht mehr flüssig.

Page 72: Von 0 auf 100 - Performance im Web

CSS-Animationen

Page 73: Von 0 auf 100 - Performance im Web

CSS-Animationen

CSS-Animationen werden durch die GPU berechnet und belasten die CPU nicht.

CSS-Animationen erscheinen flüssiger als JavaScript-Animationen.

Der Browser kann die Animationen optimieren (z.B. bei nicht sichtbaren Tabs).

Page 74: Von 0 auf 100 - Performance im Web

document.getElementById('outer').onclick = function () { this.children[0].className += ' move'; };

#inner { transition: left 5s linear; } .move { left: 500px; }

<div id="outer" class="outer"> <div id="inner" class="inner"></div> </div>

HTML

CSS

JS

Page 75: Von 0 auf 100 - Performance im Web

CSS-Animationen

Wenn Transitionen nicht reichen, kann man über Animationen mit @keyframes noch wesentlich mehr herausholen.

Es gibt auch Generatoren wie z.B. http://cssanimate.com/

Page 76: Von 0 auf 100 - Performance im Web

Prefetching

Page 77: Von 0 auf 100 - Performance im Web

Prefetching

Sorgt dafür, dass der Browser gewisse Seiten bereits vorlädt, um sie schneller laden zu können.

Chrome und IE unterstützen auch Prerendering, bei dem die Seite bereits vorgerendert wird.

<link rel="prefetch" href="users.html" />

Page 78: Von 0 auf 100 - Performance im Web

Fragen?

Rainer Sturm / pixelio.de

Page 79: Von 0 auf 100 - Performance im Web

KONTAKT

Sebastian Springer [email protected]

MaibornWolff GmbH Theresienhöhe 13 80339 München

@basti_springer

https://github.com/sspringer82