ASP Tipp 20: Vermeiden Sie die Zeichenfolgenverkettung in Schleifen

Viele Benutzer erstellen eine Zeichenfolge in einer Schleife wie folgt:

s = „<table>“ & vbCrLf

For Each fld in rs.Fields

s = s & „<th>“ & fld.Name & „</th>“

Next

While Not rs.EOF

s = s & vbCrLf & „<tr>“

For Each fld in rs.Fields

s = s & „<td>“ & fld.Value & „</td>“

Next

s = s & „</tr>“

rs.MoveNext

Wend

s = s & vbCrLf & „</table>“ & vbCrLf

Response.Write s

Bei dieser Methode gibt es mehrere Probleme. Als Erstes wird beim wiederholten Verketten von Zeichenfolgen quadratische Zeit gebraucht, d. h. die Zeit zum Ausführen dieser Schleife ist proportional zum Quadrat der Anzahl der Datensätze mal der Anzahl der Felder. Ein einfacheres Beispiel müsste dies deutlich machen.

s = „“

For i = Asc(„A“) to Asc(„Z“)

s = s & Chr(i)

Next

Bei der ersten Wiederholung erhalten Sie eine aus einem Zeichen bestehende Zeichenfolge, „A“. Bei der zweiten Wiederholung muss VBScript die Zeichenfolge neu zuweisen und zwei Zeichen („AB“) nach s kopieren. Bei der dritten Wiederholung muss s erneut zugewiesen und drei Zeichen nach s kopiert werden. Bei der Nten (26.) Wiederholung müssen N Zeichen neu zugewiesen und nach s kopiert werden. Dies ergibt eine Summe von 1+2+3+…+N und entspricht N*(N+1)/2 Kopiervorgängen.

Im oben dargestellten Beispiel für ein Recordset würde die innere Schleife bei 100 Datensätzen und 5 Feldern 100*5 = 500 mal ausgeführt werden, und die für alle Kopiervorgänge und Neuzuweisungen benötigte Zeit wäre proportional zu 500*500 = 250,000. Das sind für ein Recordset von mäßiger Größe recht viele Kopiervorgänge.

In diesem Beispiel könnte der Code verbessert werden, wenn die Zeichenfolgenverkettung durch Response.Write() oder Inlineskript (<% = fld.Value %>) ersetzt würde. Wenn der Antwortpuffer (wie empfohlen) aktiviert wird, ist dieser Code schnell, da Response.Write die Daten einfach am Ende des Antwortpuffers anhängt. Hierbei ist keine Neuzuweisung notwendig, und der Code ist sehr effizient.

In dem Sonderfall beim Transformieren eines ADO-Recordsets in eine HTML-Tabelle sollten Sie die Verwendung von GetRows oder GetString in Betracht ziehen.

Wenn Sie Zeichenfolgen in JScript verketten, wird dringend empfohlen, dass Sie den +=-Operator verwenden, d. h. verwenden Sie s += „some string“, und nicht s = s + „some string“.