Men det är ju just i loopar man brukar oroa sig för att context-switcharna ska ställa till det.
Jag tror det där med context-switchar är något gammalt. :)
Men det är ju just i loopar man brukar oroa sig för att context-switcharna ska ställa till det.
För all del. Men det är bara i vissa enklare fall som ASP-tolken kan förutsäga innehållet i loopen och göra en optimering. I fallet med konkatenering så går det tex inte. Därför blir ditt sätt att jämföra ganska missvisande.
Skrev själv en VB-app som fyllde ett asp-dokument med 10000 explicita helt slumpmässiga context-switchar och 10000 explicita (också slumpmässiga) "response.write".
Resultat:
Metod 1 (context-switchar inuti loop): 0.191
Metod 2 (Response.Write inuti loop): 0.242
Metod 1 (10000 "äkta" context-switchar): 8.634
Metod 2 (10000 "äkta" Response.Write): 5.027
Slutsats: ASP-tolken kompilerar (om möjligt) innehållet i loopar innan loopen startar. Enskilda context-switchar är långsammare än enskilda "response.write". Inte mycket, men dock.
Håller med niko. Bara för att man har en loop, så är det inte säkert att det blir kontextswitch, eftersom innehållet i loopen första gången lagras, och sedan återanvänds.
Då är en "lång" sida med många stycken av ren HTML och <% kod %> bättre ur testningssynpunkt.
Fast mätmetoden i sig är inte helt korrekt, eftersom koden tar tiden på sig själv. Det är bättre med någon typ av ISAP modul som fixar tiden från att IIS dyker in i filen, och avslutar den.
Dessutom så måste man testa sidan (som erik gjorde) kanske några hundra gånger, för att slippa effekten av minnescachning.
btw:
Metod 1 (context-switchar): 0,008
Metod 2 (Response.Write): 0,031
Metod 3 (With Response): 0,133
Metod 4 (konkatenering): 10,344
Man tycker den borde sätta ihop det redan när den kompilerar.
Men se det tycker inte VB. :)
Den anser att om du skriver:
myString1 = "Hej " & "då"
så får du skylla dig själv. Den skriver ner två strängar "Hej " och "då" i resurssegmentet och sen sätter den ihop dom under exekveringen. Om du sen lägger till en rad:
myString2 = "Hej "
.. så återanvänds det gamla "Hej ". På så sätt tjänar den 8 Bytes minnesutrymme, vilket den inte kunnat göra om den kompilerat "Hej " & "då" som "Hej då".
Ja, och det har att göra med att varje &-tecken kräver en ny minnesallokering hur liten sträng vi än ska klippa på. Vad man brukar göra är att skriva en egen strängklass som "förallokerar" stora block av minne och sen använder "CopyMemory" för att föra över tecknen.
Om man är ute efter max prestanda med ASP, så ska man göra koden i JavaScript. Har för mig att detta testades prestandamässigt här i forumet för ett bra tag sedan.