Waarom is Response.Write sneller dan aaneenschakelen van strings?
Door Ken Schaefer
11 juli 2001
De uitdaging:
Onlangs was er een discussie op de Wrox Pro-ASP mailinglist over wat sneller was: meerdere strings aaneenschakelen
gevolgd door een enkele Response.Write, meerdere aaneenschakelingen binnen een Response.Write,
of meerdere malen Response.Write.
Er werd wat bewijs gepresenteerd dat zou aantonen dat de eerste optie het snelste was. Dit staat lijnrecht tegenover
alles dat ik weet over het aaneenschakelen van strings in VBScript, en elk testresultaat dat ik hierover gezien hem.
Ik maakte mijn eigen test om voor mezelf te zien wat mijn uitkomsten zouden zijn.
Testplatform
De testen werden gedaan op een Dual Pentium II 400 MHz met 128 MB 100 MHz ECC SDRAM.
De server werkt op NT Server v4 (met SP6a) en IIS v4 met MDAC 2.5 en de v5.1 VBScript Engine.
De resultaten
Aangezien dit is waar het meeste mensen om gaat, staat het bovenaan :-)
De resultaten zijn in milliseconden. Deel het door 1000 om het aantal seconden te krijgen.
| Test nummer |
Aaneenschakelen strings |
Meerdere malen Response.Write |
| 1 |
6 187 |
47 |
| 2 |
6 453 |
47 |
| 3 |
6 265 |
31 |
| 4 |
6 297 |
47 |
| 5 |
6 297 |
46 |
| 6 |
6 343 |
47 |
De code
Elke test werd 7 keer gedaan, waarbij het eerste resultaat terzijde is gelegd (om IIS in staat te stellen de gecompileerde p-code voor de pagina te cachen).
Het timer script dat werd gebruikt was de speedtimer zoals beschreven in Hoe snel is mijn script?
De code voor de eerste test was als volgt:
For i = 1 To 10000
strVar = strVar & "Meer Blah "
Next
Response.Write(strVar)
De code voor de tweede test was als volgt:
For i = 1 To 10000
Response.Write("Meer Blah ")
Next
De gehele code kan hier
gedownload worden.
Als ik de mogelijkheid heb om de tweede optie te testen(zonder dat ik
hiervoor meer dan 1000 regels code hoef te schrijven), zal ik dat ook testen,
maar mijn instinct zegt me dat het resultaat ergens tussen de 2 hierboven
vermelde testen zal vallen, maar dichter bij de eerste dan de tweede test.
Waarom duurt een VBScript aaneenschakeling zo lang?
Omdat VBScript arrays gebruikt
om string aaneenschakelingen te verwerken, en verkleinen van arrays in VBScript
is ontzettend inefficiënt. Het volgende beschrijft dit in meer detail en is gehaald
uit het Microsoft's KB artikel Q170964.
Als je herhaalde aaneenschakelingen uitvoert van het type:
For I To N
Dest = Dest & Source
Next
zal de lengte van tijd proportioneel toenemen tot N2. Aldus, 1000 herhalingen duurt ongeveer 100 keer langer dan 100 herhalingen.
Dit komt doordat Visual Basic niet alleen de bron karakters toevoegt aan het eind van de nieuwe string; het voert ook de volgende operaties uit:
- wijst een tijdelijk geheugen toe dat groot genoeg is om het resultaat te behouden
- kopieert Dest naar het begin van het tijdelijke gebied
- kopieert de Source naar het einde van het tijdelijke gebied
- de-alloceert de oude kopie van Dest
- wijst een geheugen toe voor Dest dat groot genoeg is om het resultaat te behouden
- kopieert de tijdelijke data naar Dest
Stappen 2 en 6 zijn erg kostbaar en resulteren er in wezen in dat de gehele aaneenschakeling tweemaal
gekopieerd wordt met bijgevoegde overhead.
© Ken Schaefer
(vertaling copyright ASPNL)
|