Hi,
ich habe ein Script, welches mit recht komplexen regulären Ausdrücken eine Seite nach Glossarbegriffen durchsucht und gefundene Begriffe durch DFN-Nodes ersetzt.
Was auch immer DFN-Nodes sein mögen. Aber egal: "komplexen reguläre Ausdrücke" sind teuer. Jedes Wort in einer Seite damit abzuklappern ist noch teurer. Diese Kombination in Javascript skaliert auch nur mehr schlecht als recht -- um es mal ganz vorsichtig auszudrücken.
Das funktioniert an sich mittlerweile tadellos.
Leider habe ich das Ganze während der Entwicklung nur mit 5, 6 Glossarbegriffen getestet. Jetzt mußte ich aber bei einem Probelauf mit der kompletten Glossarliste (80 Begriffe) feststellen, daß meine Anwendung den Browser und den kompletten Rechner bei umfangreicheren Seiten für 1 Minute und mehr komplett auslastet und damit lahmlegt.
Schon bei 80? Dann stimmt höchstwahrscheinlich der Algorithmus nicht oder die Maschine ist nur ein 486er.
Ich habe den Eindruck, daß die Gesamtzeit etwas kürzer ist, d.h. die Performance etwas besser, wenn ich zwischendurch Test-Alerts ausgebe und damit das Script immer wieder unterbreche.
Frage 1 dazu: haltet Ihr das für plausibel, oder bilde ich mir das ein?
Das ist Einbildung. Kann ich aber nachvollziehen, geht mir manchmal genauso. Messungen ergeben aber, das es natürlich mit der Alert-Ausgabe länger dauert.
Grundsätzlich in aller Kürze Folgendes zu meinem Ansatz:
Mein Script basiert hauptsächlich auf einer rekursiven Funktion, die sich, beginnend bei einem bestimmten Knoten (einem DIV mit der id "content"), durch dessen Unterelemente hangelt und jeden Textknoten in einer for-Schleife, die über einen Array mit den Glossarbegriffen iteriert, nach den Glossarbegriffen durchsucht (mittels exec()).
Aha, ich habe schon so meine Vermutungen:
Zum einen: wofür sind die Regexe genau? Normalerweise brauchst Du für den beschriebenen Zweck keine.
Durchsuchst Du das Array linear oder hast Du ein assoziatives Array gebastelt?
Ich hätte das so gelöst:
glossar = new Array();
glossar["wort1"] = "Definition für Wort 1";
glossar["wort2"] = "Definition für Wort 2";
glossar["wort3"] = "Definition für Wort 3";
...
text = textknoten.split(" ");
for(var i = 0;i < text.length;i++){
if(glossar[ text[i] ] != 'undefined')
makeDFNNode(text[i]);
}
Das sollte so halbwegs skalieren und ist vielleicht auch noch anderweitig optimierbar. Weniger Text z.B. Nein, ernstgemeint: besser mehr Seiten mit weniger Text als einige zu große. Das JS extern halten, dann wird das schonmal gecached (aber trotzdem jedesmal neu geparsed, leider) und nur der Text wird ausgetauscht.
Vermutlich stoße ich mit diesem Script schlicht und einfach an die Grenzen der Leistungsfähigkeit von Browsern.
Nein, am Browser/Compiler/Interpreter liegt's eher selten >;->
so short
Christoph Zurnieden