Andreas Dölling: RegExp-Problem für Glossar gelöst

Beitrag lesen

Hallo,

für alle, die es interessiert:
wir haben unter http://forum.de.selfhtml.org/?t=100676&m=617171 ein Performance-Problem diskutiert, das sich eindeutig auf den exzessiven Einsatz von komplexen regulären Ausdrücken zurückführen ließ.

Ich habe das Script jetzt an einigen neuralgischen Punkten ein wenig verändert und konnte auf diese Weise die Performance erheblich steigern - so sehr, daß man das Script jetzt einsetzen kann!

Vorher wurde der reguläre Ausdruck zu jedem Glossarbegriff immer wieder on the fly als neues Objekt angelegt, also beim Durchlaufen von sagen wir mal 10 Textknoten im HTML-Dokument jeweils 10 mal. Das ist natürlich Unfug. Daher wird der reguläre Ausdruck zu jedem Glossarbegriff nun vor dem Durchlaufen der Knoten des HTML-Dokuments einmal angelegt und dann immer wieder benutzt.

Den eigentlichen Performance-Gewinn brachte aber, daß ich jetzt der Ausführung des regulären Ausdrucks auf einen Textknoten immer einen groben Vorabtest vorgeschaltet habe, der prüft, ob der jeweilige Glossargebriff überhaupt in irgendeiner Form im Knoten vorkommt. Dieser Vorabtest ist natürlich dann ein entsprechend einfacher und schneller RegExp. Und nur wenn dieser Ausdruck matcht, wird der eigentliche komplexe Ausdruck angewendet.

Das Ganze sieht dann so aus:
for(k=0; k<glossary.length; k++) {
   var tmpRegExp = new RegExp(glossary[k]["term"], "ig");
   if(!tmpRegExp.test(parentObj.childNodes[i].nodeValue)) continue;
   var matched = glossary[k]["regexp"].exec(parentObj.childNodes[i].nodeValue);
   if(matched) {
      var preText = document.createTextNode(matched[1]);
      var postText = document.createTextNode(matched[3]);
      var dfnText = document.createTextNode(matched[2]);
      var dfnNode = document.createElement("DFN");
// ...etc.

Damit läuft es jetzt wie geschmiert, bei weiterhin vollem Leistungsumfang, wobei erstaunlicherweise festzustellen ist, daß der IE bei sehr großen HTML-Seiten deutlich schneller ist als der Firefox.

Grundsätzlich bleibt aber trotz der oben skizzierten Lösung festzuhalten, daß derartige Funktionalitäten serverseitig wohl doch besser aufgehoben sind.
;)

Danke an alle, die mitdiskutiert haben!

Ciao,
Andreas