Performance

Transcription

Performance
Performance
Bedarf an Zeit, Speicher, Netz
und anderen Ressourcen
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
Lernziel
O
Warum ist Performance bei Ajax so wichtig?
O
Was sind die Fallen bei Ajax Programmierung?
O
Welche Werkzeuge gibt es?
O
Ausgewählte Beispiele
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
2
Bedeutung
Bisher: Javascript Performanz egal
O Nur kleines Code Schnippsel für kleine Aufgabe
O Lebensdauer nur Lesedauer einer Web-Seite
Neu: Javascript Performanz wichtig, denn
O Komplette Anwendung in Javascript (ganzes "Word" !)
O Höhere Verweildauer und Interaktionshäufigkeit des Users auf der Seite
O Verlust von hohem Datenbestand des Users
O Signifikante Rate von Transaktionen auf der Seite
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
3
Zeitmessung (1)
Variante 1:
Einfache Zeitmessung mit Date Objekt
var start = new Date();
do some work
var stop = new Date();
var diff = stop – start; // ergibt Zeit in ms
Variante 2:
Kategoriell sortierte Zeitmessung
Javascript Objekt, das zu unterschiedlichen IDs Zeitwerte nimmt
start (id); // startet timer zur id
stop (id); // stoppt timer zur id
show (id); // gibt kumulierte Statistik aus
Statistik
St
ti tik
O Anzahl Aufrufe
O Kumulierte Zeit
O Mittlere, maximal, minimal Zeit
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
4
Zeitmessung (2)
Variante 3:
Zeitmessung in Profiler
Gutes Werkzeug: Venkman Debugger
Bietet Möglichkeit, Profile Daten mitzuschreiben
Anschließend unter "File" speichern
Formate: XML, HTML, TXT, CVS
Liefert hochdetailliertes Calling Profile
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
5
Zeitmessung (3)
mit dem Venkman
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
6
Optimierung
1 Klassische Optimierung
1.
O Wie bei allen anderen Sprachen auch
O Bei compilierten Sprachen vieles vom Compiler gemacht;
hier: nichts vom Compiler gemacht – Programmierer muß einspringen
O Bsp: Loop invarianten Code vor die Loop stellen
O Bsp: Loop Unrolling
O Bsp: Expression Minimization
Mögliche Ziele
Space Optimierung
O Bsp: Dot Minimization
g
Time Optimierung
2. Ajax spezifische Optimierung
O Late DOM Attachment
O Minimiere
Mi i i
A
Anzahl
hl S
Server-Calls
C ll
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
7
Minimize DOT Notation
Beachte: Jeder Zugriff erfolgt interpretiert
var h = app.clock.hands.hour;
var m = app.clock.hands.minute;
var s = app.clock.hands.second;
var
var
var
var
hands = app.clock.hands;
h = hands.hour;
m = hands.minute;
s = hands.second;
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
8
Expression Minimization
Cachen von shared subexpressions
Normal: Compiler als Teil der Datenfluß-Analyse und Register-Allokation
Hier:
O Interpretiert
O Keine Datenfluß-Analyse oder Register-Allokation
O Scripting Philosophie eines "kleinen" Scripts
kollidiert mit größerer Ajax Anwendung
var a = (b + c)*(b + c) + 3*(b + c);
var x = b + c;
var a = x * x + 3 * x;
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
9
Late DOM Attachment
Jede Änderung der DOM bewirkt Anstoßen von Browser Layout Mechanismen
Spezielle Probleme:
O Verschachtelte Strukturen
O Relativ positionierte Objekte
O Hinzuzufügende Attribute
Lösung:
Late DOM Attachment
O Neuen DOM Knoten vollständig aufbauen
O Erst jetzt in document Objekt einbauen
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
Late
ate DOM
O Attachment
ttac
e t ist
st d
die
e
eine wesentliche Optimierung
die jeder kennen & nutzen muß
10
Minimiere Anzahl Server Calls
HTTP ist langsam da
O je HTTP eine TCP-Verbindung mit 3-way Handshake
Aber: Auch stay-alive Verbindungen möglich
O Browser limitiert Anzahl paralleler Verbindungen
O jede einzelne Verbindung kann in Congestion hängenbleiben
Ansatz: Minimiere Anzahl Server Calls
O Nur eine CSS Datei
O Nur eine JS Datei
O CSS und JS als HTML Inline-Konstrukt
Aber: Dann kein Caching mehr möglich
O Merging
M i von CSS iin JS
O Bilder und Objekte via data: URL einbetten
Aber: Dann keine Wiederverwendung einer Datei sondern replizierte Einbettung
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
11
DOM Node Leak (1)
Frage: Wie entferne ich für den User einen Teil eines Dokuments
Bsp:
Kleines Info-Panel, das immer wieder ein- und ausgeblendet wird
Antwort 1:
O Bsp:
O Problem:
O
Lösung:
Unsichtbar machen – Removal by Hiding (=unlink on hide)
Via CSS Attribut
Node bleibt in DOM bestehen (Node Leak)
Anwendung erzeugt immer neue Nodes
Gefahr multipler Nodes mit identischem ID Attribut
Nicht immer neu generieren
generieren, reuse sicherstellen
Create Funktion in Create-if-not-exists-else-reuse Semantik
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
12
DOM Node Leak (2)
Antwort 2:
Bsp:
Problem:
Lösung:
Besser:
Aus DOM entfernen – Removal by Detachment
replaceChild, removeChild Funktionen der DOM API
Hoffe, daß ein Garbage Collector sich darum kümmert
Das tut er vermutlich auch
Analoger Reuse Ansatz wie zuerst
Dazu: Node statt in Dokument in DOM Node Pool "parken"
Drip Tool von J.
J Webber für DOM Leak Messung bei Explorer
http://outofhanwell.com/ieleak/index.php?title=Main_Page
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
13
Zirkuläre Referenzen (1)
Zirkuläre Referenzen sind klassisches Problem für manche Garbage Collectors
Beispiel:
Javascript – DOM Zirkulärreferenz
function MyOb (id) {
this.id = id;
this.front = document.createElement ("div");
this.front.backingObj = this;
}
Problem:
O Objekt nicht nur zirkuläre JS Objekt Referenz, auch Teil der DOM Hierarchie
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
14
Zirkuläre Referenzen (2)
Lösen zirkulärer Referenzen über Finalizer Methoden
Explizites Aufrufen durch Programmierer erforderlich
MyOb.prototype.finalize = function () {
this.front.backingOBj = null;
this.front = null;
}
Mark and Sweep GC:
Mark-and-Sweep
Reference Counting:
Räumt auch zyklischen Müll weg
Probleme mit zyklischem Müll
Unklar,
U
kl wie
i jeweilige
j
ili Implementierung
I
l
ti
aufgebaut
f b t ist
i t
Beides wird gefunden, teilweise auch mit diversen Bugs
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
15
Zirkuläre Referenzen (3)
function AddFive(x) {return x + 5;}
function AddTen(x) {return x + 10;}
var MyFunc;
if (whatever) {MyFunc = AddFive;}
else {MyFunc = AddTen;}
print(MyFunc(123)); // Either 133 or 128
Beispiel
für Closure Bildung
function AdderFactory(y) {return function(x){return x + y;}}
var MyFunc;
if (whatever) {MyFunc = AdderFactory(5);}
else
l
{M
{MyFunc
F
= Add
AdderFactory(10);}
F t
(10) }
print(MyFunc(123)); // Either 133 or 128.
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
16
Zirkuläre Referenzen (4)
<body>
Beispiel
für Closure Bildung
<div class='menu-bar' id='myMenu'></div>
<script language='javascript'>
var menu = document.getElementById('myMenu');
function AttachEvent(element) {
element.attachEvent( "onmouseover", mouseHandler);
function mouseHandler(){ /* whatever */ }
}
AttachEvent(menu);
</script></body>
div hat eine Referenz auf mouseHandler
mouseHandler
H dl hat als closure
clos re Referenz
Referen a
auff Scope zu Definitions
Definitionszeitpunkt
eitp nkt
Dieser enthält menu
menu verweist auf div
Diese zirkuläre Referenz
wird vom Explorer nicht aufgelöst
Clemens H. Cap
http://wwwiuk.informatik.uni-rostock.de
http://www.internet-prof.de
17