ASPNL logo (1 kb)
Thursday, May 17, 2012




Microsoft MVP

.NET Codewise Community
<< vorige | overzicht | volgende >>

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)

<< vorige | ^ naar boven | overzicht | volgende >>
copyright 2000-2007 ASPNL