Performance Javascript
Oliver
- javascript
0 Utz0 Sven Rautenberg
0 Oliver
Hallo und Guten Morgen,
ich habe da ein kleines Problem mit der Performance von Javascript.
Ich habe eine Tabelle, wobei in jeder Zelle ein InputField zur Eingabe von Daten definiert ist. Für diese Eingabe möchte ich einen Check durchführen, d.h. es soll überprüft werden, ob eine gültige Taste gedrückt wurde und beim Verlassen der Zelle soll nochmal geprüft werden, ob die gesamte Eingabe gültig ist.
Dazu habe ich mir Funktionen geschrieben, die bei den Event-Behandlungsaufrufen onkeydown, onkeypress, onchange und onblur für jede Zelle gerufen werden, und auch in jedem Input-Tag angegeben sind. Diese Funktionen befinden sich in einem externen Javascript und ich arbeite mit regulären Ausdrücken für den Check.
Nun zu meinem Problem: In Abhängigkeit von der Größe der Tabelle kommt es mitunter zu enormen Performance-Problemen. Hat die Tabelle mehr als 1000 Zellen (das ist leider nötig), dauern die Funktionaaufrufe extrem lange. Bei kleineren Tabellen (ca 100 Zellen)
ist die Performance dagegen ok. Die Performance hängt also von der Größe der Tabelle ab (und auch von der Rechenpower des verwendeten PCs).
Das verstehe ich allerdings nicht so richtig, da die Anzahl der Funktionsaufrufe sich ja nicht ändert, es existieren in dem einen Fall nur mehr Inputfelder in der Tabelle.
Hat jemand hier eine Idee? Vielleicht mache ich ja auch etwas total falsch ;-)
Vielen Dank für Eure Hilfe
Oliver
Hallo,
Hat jemand hier eine Idee? Vielleicht mache ich ja auch etwas total falsch ;-)
Ja: vielleicht machst Du etwas total falsch ;-) Sieht so aus, als würde irgendwas in Deinem Code z.B. über alle Input-Felder iterieren, was den Effekt erklären könnte. Lässt sich aber nicht sagen ohne den Code zu sehen - hast Du nen Link?
Grüße,
Utz
Moin!
Ja: vielleicht machst Du etwas total falsch ;-) Sieht so aus, als würde irgendwas in Deinem Code z.B. über alle Input-Felder iterieren, was den Effekt erklären könnte. Lässt sich aber nicht sagen ohne den Code zu sehen - hast Du nen Link?
Ich weiß, was da mindestens "iteriert": Der Zugriff auf das Formularfelder-Array.
getElementById() ist beispielsweise ein sehr teurer Aufruf, dessen Ergebnis man in jeden Falle zwischenspeichern sollte, anstatt ihn mehrfach mit identischer ID zu wiederholen. Außerdem verkürzt das den Code und macht ihn dadurch wahrscheinlich verständlicher und schneller.
Wie es sich mit Zugriffen auf document.forms[].elements[] verhält, kann ich aus dem Kopf nicht sagen, aber grundsätzlich würde ich vermuten, dass riesige Formulare auch an dieser Stelle mehr Aufwand bedeuten, und ein Zwischenspeichern durchaus sinnvoll sein kann.
- Sven Rautenberg
Ich weiß, was da mindestens "iteriert": Der Zugriff auf das Formularfelder-Array.
Den ganzen Spökes kann man sich schenken, wenn this aus dem Element übergeben wird.
Hallo zusammen,
tja, das Ratespiel geht weiter...Wird getElementById() verwendet? Könnte man die Aufrufe über this regeln? Ist doch was ganz anderes? Ohne Code laufen hier noch die Kristallkugeln heiß.
Grüße,
Utz
Moin!
tja, das Ratespiel geht weiter...Wird getElementById() verwendet? Könnte man die Aufrufe über this regeln? Ist doch was ganz anderes? Ohne Code laufen hier noch die Kristallkugeln heiß.
Dass du auch immer was zu mäkeln hast...
Mitglied im Ring Deutscher Mäkler
Ach so, das erklärt alles. ;)
- Sven Rautenberg
Hallo zusammen,
Danke für Eure Bemühungen. Der Tip mit dem "getElementById()" hat geholfen. Leider hatte ich eine Funktion ignoriert, die auch noch gerufen wurde neben meinen InputChecks. Und just in dieser Methode wurde getElementById() bei jedem onkeydown verwendet.
Nun verstehe ich auch die Performance-Probleme ;-)
Nochmals Danke und Viele Grüße,
Oliver
Hallo zusammen,
Danke für Eure Bemühungen. Der Tip mit dem "getElementById()" hat geholfen. Leider hatte ich eine Funktion ignoriert, die auch noch gerufen wurde neben meinen InputChecks. Und just in dieser Methode wurde getElementById() bei jedem onkeydown verwendet.
Nun verstehe ich auch die Performance-Probleme ;-)
Nochmals Danke und Viele Grüße,
Oliver