jQuery Performance

33

description

 

Transcript of jQuery Performance

Page 1: jQuery Performance
Page 2: jQuery Performance

Javascript Performance-Optimierung

Johannes Weber TM09

Page 3: jQuery Performance

Agenda

• Was beeinflusst die Performance-Optimierung?

• Lookups einsparen

• Loop optimierung

• Event delegation

• Performance Tipps

Page 4: jQuery Performance

Was beeinflusst die Performance-

Optimierung?

• Performance-Optimierungen sind stets fallspezifisch

• MacBook Pro

• Leopard

• 2.5GHz Intel Core2 Duo

• 2GB RAM

• Firefox 3.5.5

• Firebug

• Für jede Optimierung sind Verbesserungen im Millisekundenbereich möglich

Page 5: jQuery Performance

Performance um jeden Preis?

• Performance vs.

• Lesbarkeit

• Datenintegrität

• Wartbarkeit

• Wiederverwendbarkeit

• Entwicklungsgeschwindigkeit

Page 6: jQuery Performance

Lookups einsparen

Page 7: jQuery Performance

Lookups einsparen (Nativ)

document.getElementById('example').innerHTML = 'HTML INHALT';

document.getElementById('example').style.color = '#123456';

document.getElementById('example').style.height = '20px';

var exampleElement = document.getElementById('example');

exampleElement.style.height = '20px';

exampleElement.style.color = '#123456';

exampleElement.innerHTML = 'HTML INHALT';

Page 8: jQuery Performance

Lookups einsparen (Nativ)

Page 9: jQuery Performance

Lookups einsparen (jQuery)

$('.example').css('height', '20px');

$('.example').css('color', '#123456');

$('.example').html('HTML INHALT');

var $exampleElement = $('.example');

$exampleElement.css({

'color': '#123456',

'height': '20px'

})

$exampleElement.html('HTML INHALT');

Page 10: jQuery Performance

Lookups einsparen (jQuery)

Page 11: jQuery Performance

Loop Optimierung

Page 12: jQuery Performance

Loop-Optimierung 1

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

for (var i = 0; i < anArray.length; i++) {

var currentElement = anArray[i];

}

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

for (var i = 0; i < anArrayLength; i++) {

var currentElement = anArray[i];

}

Page 13: jQuery Performance

Loop-Optimierung 1

Page 14: jQuery Performance

Loop-Optimierung 2

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

for (var i = 0; i < anArrayLength; i++) {

var currentElement = anArray[i];

}

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

var currentElement;

for (var i = 0; i < anArrayLength; i++) {

currentElement = anArray[i];

}

Page 15: jQuery Performance

Loop-Optimierung 2

Page 16: jQuery Performance

Loop-Optimierung 3

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

var currentElement;

for (var i = 0; i < anArrayLength; i++) {

currentElement = anArray[i];

}

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

var currentElement;

for (var i = 0; i < anArrayLength; ++i) {

currentElement = anArray[i];

}

Page 17: jQuery Performance

Post- und Pre-Inkrementierung

// Post-Inkrementierung

var i = 1;

var z = i++; // z = 1, i = 2

// Pre-Inkrementierung

var i = 1;

var z = ++i; // z = 2, i = 2

Page 18: jQuery Performance

Loop-Optimierung 3

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

var currentElement;

for (var i = 0; i < anArrayLength; i++) {

currentElement = anArray[i];

}

var anArray = ['Foo', 'Bar', 'Moo', 'Cow'];

var anArrayLength = anArray.length;

var currentElement;

for (var i = 0; i < anArrayLength; ++i) {

currentElement = anArray[i];

}

Page 19: jQuery Performance

Loop-Optimierung 3

Page 20: jQuery Performance

Event Delegation

Page 21: jQuery Performance

Event Delegation

• Binden von Events an Elternelemente der konkreten Event-Ziele

• Einsatzgebiet: Tabellarische Darstellungen wie Excel, Kalender, ...

<ul>

<li>Element 1</li>

<li>Element 2</li>

<li>Element 3</li>

...

</ul>

Page 22: jQuery Performance

Event Delegation

$('li').bind('click', function (event) {

var $this = $(this);

$('div').html($this.html());

});

$('ul').bind('click', function (event) {

var $target = $(event.originalTarget);

$('div').html($target.html());

});

Page 23: jQuery Performance

Event Delegation Bindungsdauer

Page 24: jQuery Performance

Performance Tipps

Page 25: jQuery Performance

#id vs .class

• CSS 1 - 3 Selektoren - Sizzle CSS Selector Engine

• verlockend durch kurze Schreibweise

• $('#id') -> document.getElementById()

• $('.class') -> durchsuchen jedes DOM Elementes

Page 26: jQuery Performance

#id vs .class

var d = new Date();console.info("Class Test:");console.info("-- Start: " + d.getSeconds() + " " + d.getMilliseconds());var testBody = "";for (var i=0; i<1000; i++){ testBody += "<div class='testable"+i+"'>";}$("body").append(testBody);for (var i=0; i<1000; i++){ $(".testable"+i);}// ----------------------------------var d = new Date();console.info("-- End: " + d.getSeconds() + " " + d.getMilliseconds());console.info("-- ID Test");console.info("-- Start: " + d.getSeconds() + " " + d.getMilliseconds());testBody = "";for (var i=0; i<1000; i++){ testBody += "<div id='testable"+i+"'>";}$("body").append(testBody);for (var i=0; i<1000; i++){ $("#testable"+i);}var d = new Date();console.info("-- End: " + d.getSeconds() + " " + d.getMilliseconds());console.info("End Test");

Page 27: jQuery Performance

#id vs .class

• nur soviele Suchinformationen wie nötig!

• Beispiel: Formular validierung

Page 28: jQuery Performance

#id vs .class

// 50 INPUT Elemente müssen vor Absenden des Formulares validiert werden// <input type=text class="notBlank">

// der „schlechte“ Weg$(".notBlank").each(function(){ if ($(this).val()=="") $(this).addClass("error");});

// der „gute“ Weg$("input.notBlank").each(function(){ if ($(this).val()=="") $(this).addClass("error");});

// der „beste“ weg$("input:text.notBlank").each(function(){ if ($(this).val()=="") $(this).addClass("error");});

Page 29: jQuery Performance

Selectoren Cachen

• $() -> jQuery Object

• 1 Aufruf -> kein caching

• > 1 Aufrufe -> caching!

• Beispiel: Formular validierung

Page 30: jQuery Performance

#id vs .class

$("#ourHideButton").click(function(){ $(".hideable").hide();});

var hideable;

$("#ourHideButton").click(function(){ if (hideable) hideable.hide(); else hideable = $(".hideable").hide();});

Page 31: jQuery Performance

Tipps & Tricks

• Google Page Speed

• YSlow

• JS compressor

• Google closure-compiler

Page 32: jQuery Performance

Q & A

Page 33: jQuery Performance