Javascript
Paul
- programmiertechnik
Moin.
Sollte man ("gute" Programmierung, Performance, Wartbarkeit, ...) z.B. in Schleifen lieber mit Objekten und dessen Elementen arbeiten oder diese lieber vorher in Variablen schreiben?
Beispiel 1:
for(...) {
if(myObjekt.myElement == "test") {...}
else if(myObjekt.myElement == "test2") {...}
abc = myObjekt.myElement + 123;
...
}
Beispiel 2:
for(...) {
var myVar = myObjekt.myElement;
if(myVar == "test") {...}
else if(myVar == "test2") {...}
abc = myVar + 123;
...
}
Hallo,
jeder Umkopieren von Variablen belegt Speicher. Das ist aber m.E. erstmal irrelevant. Du erzeugst aber vermutlich auch unübersichtlicheren Code, es sei denn du brauchst das als Kürzel wie
l = myArray.length;
oder
elm = document.getElementById("bla").getElemenstByTagName("div")[0];
Gruß
jobo
elm = document.getElementById("bla").getElemenstByTagName("div")[0];
Muss sich die JS Engine nicht auch jedes durch das DOM wühlen um das Element zu bekommen? Dachte es könnte schneller/besser sein das mit einer Variablen zu machen...
Hallo,
elm = document.getElementById("bla").getElemenstByTagName("div")[0];
Muss sich die JS Engine nicht auch jedes durch das DOM wühlen um das Element zu bekommen? Dachte es könnte schneller/besser sein das mit einer Variablen zu machen...
ja, bestimmt...; wobei es vielleicht auch irgendwelche caching-mechanismen geben könnte...;
Gruß
jobo
Tach!
jeder Umkopieren von Variablen belegt Speicher.
Jein. Objekte werden üblicherweise nicht kopiert, für die wird nur eine weitere Referenz erzeugt. Die Verwaltung der Referenz, sprich: der Variablenname, belegt etwas Speicher, aber auch dafür gilt:
Das ist aber m.E. erstmal irrelevant.
Du erzeugst aber vermutlich auch unübersichtlicheren Code, es sei denn du brauchst das als Kürzel wie
l = myArray.length;
oder
elm = document.getElementById("bla").getElemenstByTagName("div")[0];
Kürzel in dem Sinne, wie Paul schon richtig erkannt hat, dass die Werte nicht mehr neu ermittelt werden müssen sondern eine direkte Referenz oder im Fall von length eine Kopie des Wertes erzeugt wird. Das kürzt zumindest bei den Referenzen den weiteren Verarbeitungsprozess ab.
dedlfix.
Moin!
Kommt drauf an, was du machst. Wenn Du in jedem Durchgang das gleiche Element bedienst (z.B. Zeitanzeige) dann ist es performanter, sich das Element vor der Schleife 1x zu greifen und in der Schleife dann ueber das so angelegte Objekt zu gehen. Sonst muesste der Browser jedesmal das Element suchen.
Wenn Du ueber Elemente iterierst, macht es wenig Sinn die zuerstmal rauszufischen und zuzuweisen und dann uber die neu angelegten Referenzen drauf zuzugreifen. Ausser du packst sie z.b. in ein Array zu spaeteren Verarbeitung.
In deinen Beispiel untersuchst du dein Element auf bestimmte Inhalte. Eventuell ist dein kompletter Code verbesserungswuerdig. Auf alle Faelle wuerde eine switch Anweisung Sinn machen. Else If mit immer der gleichen Variable ist eigentlich immer ein Kandidat fuer switch.
servus Paul,
Efficient Javascript - Dev.Opera
der wurzelbert
Hallo Paul,
da gibt es eine einfache Regel:
Innerhalb von Schleifen wenn eben möglich auf Punkte und eckige Klammern also auf Array- und Objekjtzugriff verzichten.
Speziell in deinem Beispiel sollte noch das "var myVar =..." vor die Schleife, wenn sich "myObjekt.myElement" in der Schleife nicht ändert. Gleiches gilt auch für (aufwändige) Rechnungen.
Natürlich muss man auch abwägen, welche Nachteile so eine Mikrooptimierung mit sich bringt. Wenn ich die Meldung "Ein Script belastet den Rechner ..., soll es abgebrochen werden" vermeiden muss, tue ich alles. Aber für einige Millisekunden würde ich den Code nicht aufblähen, zumal ja die evtl. längere Ladezeit auch noch berücksichtigt werden muss.
Gruß, Jürgen