forum Sea of Sin / Startseite sitemap

Sea of Sin / Blog

Zentrum der Langeweile

JavaScript Tipp-Kick #1

2008/05/12 von de_henne
Kurze Ansprache:
JavaScript kann man auch performant schreiben, um dies zu beweisen werde ich hier und da mal einige Tipps in die freie Welt raus lassen.

Tipp-Kick #1 – for
Stay a while, and listen
  Grundszenario:
Wir wollen ein Array mit einer For-Schleife durchgehen.

Unser Array:
  1. var myarray = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);

Eine normale Standardschleife (Schleife 1):
  1. for(var i = 0; i < myarray.length; i++)
  2. {
  3. // irgendwas machen
  4. }

Hmm schreiben wirs mal anders (Schleife 2):
  1. for(var i = 0, len = myarray.length; i < len; i++)
  2. {
  3. // irgendwas machen
  4. }

Nun das ganze im Vergleich

Damit der Vergleich auch funktioniert werden beide For-Schleifen 100.000 mal im Test durchlaufen.

Firefox 3
Schleife1 = 424 Milisekunden
Schleife2 = 374 Milisekunden

Firefox 2
Schleife1 = 1016 Milisekunden
Schleife2 = 438 Milisekunden

IE 7
Bricht ab daher auf 10.000 runter gedrosselt
Schleife1 = 94 Milisekunden
Schleife2 = 62 Milisekunden

Opera
Schleife1 = 1032 Milisekunden
Schleife2 = 531 Milisekunden

Konqueror
Bricht ab daher auf 10.000 runter gedrosselt
Schleife1 = 766 Milisekunden
Schleife2 = 627 Milisekunden



Erklärung:

Wieso Schleife2 schneller ist, ist schnell erklärt. Wie oft die Schleife durchlaufen werden muss hängt von der Array Länge ab. Wenn i < myarray.length verwendet wird, muss jedesmal auf das „ myarray“ Objekt zurück gegriffen und die „length“ Eigenschaft aufgerufen werden.

Dies kostet Zeit. Da in der 2ten Schleife die Länge in die Variable „len“ geschrieben wird, muss das Objekt nicht mehr aufgerufen werden.

Bei einem minimalen Array hat dies keine grossen Auswirkung. Wenn jedoch größere Obejtek oder Arrays durchlaufen werden sollen kann dies viel Performance kosten.

Zum Livetest

Ich habe mir dies schon seit über einem Jahr angewöhnt eine For Schleife so zu schreiben.


Testcase Code
  1. <script type="text/javascript">
  2.  
  3. /**
  4.   * Performance
  5.   */
  6. var myarray = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);
  7. var loops = 100000;
  8.  
  9. function start_test()
  10. {
  11. for1();
  12. for2();
  13. }
  14.  
  15. function for1()
  16. {
  17. var start = new Date();
  18.  
  19. for(l = 0; l < loops; l++)
  20. {
  21. for(var i = 0; i < myarray.length; i++)
  22. {
  23. // irgendwas machen
  24. };
  25. };
  26.  
  27. var end = new Date();
  28. loop = end-start;
  29.  
  30. document.getElementById('for1').innerHTML = loop;
  31. };
  32.  
  33. function for2()
  34. {
  35. var start = new Date();
  36.  
  37. for(l = 0; l < loops; l++)
  38. {
  39. for(var i = 0, len = myarray.length; i < len; i++)
  40. {
  41. // irgendwas machen
  42. };
  43. };
  44.  
  45. var end = new Date();
  46. loop = end-start;
  47.  
  48. document.getElementById('for2').innerHTML = loop;
  49. };
  50.  
  51. </script>

Gruss
henbug
  • Keine Kommentare