webForumDet fria alternativet

Mer sträng tester

ASP

21 svar · 534 visningar · startad av Erik Juhlin

Medlem sedan maj 200010 687 inlägg
Frågan#1

Context-switchar verkar vara snabbast... :)

<html><%
Dim i, init, diff, str

'Metod 1
Response.Write "<!--"

init = Timer
For i = 0 To 10000
	%>i=<%=i%>
|<%
Next
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 1 (context-switchar): " & FormatNumber(diff, 3, True) & "<br>"

'Metod 2
Response.Write "<!--"

init = Timer
For i = 0 To 10000
	Response.Write "i="
	Response.Write i
	Response.Write vbCrLf
	Response.Write "|"
Next
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 2 (Response.Write): " & FormatNumber(diff, 3, True) & "<br>"

'Metod 3
Response.Write "<!--"

init = Timer
With Response
For i = 0 To 10000
		.Write "i="
		.Write i
		.Write vbCrLf
		.Write "|"
Next
End With
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 3 (With Response): " & FormatNumber(diff, 3, True) & "<br>"

'Metod 4
Response.Write "<!--"

init = Timer
For i = 0 To 10000
	str = str & "i=" & i & vbCrLf & "|"
Next
Response.Write str
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 4 (konkatenering): " & FormatNumber(diff, 3, True) & "<br>"
%></html>
Medlem sedan aug. 20002 272 inlägg
#2

Första testen:
Metod 1 (context-switchar): 0,016
Metod 2 (Response.Write): 0,000
Metod 3 (With Response): 0,031
Metod 4 (konkatenering): 1,359

Andra testen:
Metod 1 (context-switchar): 0,000
Metod 2 (Response.Write): 0,016
Metod 3 (With Response): 0,016
Metod 4 (konkatenering): 1,391

Medlem sedan maj 200010 687 inlägg
#3

Du har nog lite för snabvb dator. Kan ju öka på till 10-20 000 då för att märka nån skillnad. :)

Medlem sedan feb. 200112 078 inlägg
#4

Där ser man. :)

Och hur många gånger har man inte sett predikan om att inte context-switcha? ;)

Medlem sedan feb. 200112 078 inlägg
#5
Metod 1 (context-switchar): 0,031
Metod 2 (Response.Write): 0,051
Metod 3 (With Response): 0,109
Metod 4 (konkatenering): 7,301

800Mhz, 256, win2000 pro.

Medlem sedan juni 20014 421 inlägg
#6

Försök 1 (Utan något fönster öppet förutom testfönstret)

Metod 1 (context-switchar): 10,930
Metod 2 (Response.Write): 18,789
Metod 3 (With Response): 20,492
Metod 4 (konkatenering): 36,469

Försök 2

Metod 1 (context-switchar): 14,891
Metod 2 (Response.Write): 19,281
Metod 3 (With Response): 21,090
Metod 4 (konkatenering): 17,578

Försök 3

Metod 1 (context-switchar): 15,160
Metod 2 (Response.Write): 19,609
Metod 3 (With Response): 21,039
Metod 4 (konkatenering): 17,570

Försök 4

Metod 1 (context-switchar): 15,051
Metod 2 (Response.Write): 19,449
Metod 3 (With Response): 21,031
Metod 4 (konkatenering): 18,570

De andra försöken med ett mapp-fönster öppet och webforum öppet.

166MHz, 32, Win98SE

Medlem sedan juni 200032 967 inlägg
#7

Hmmm...

Metod 1 (context-switchar): 0.016
Metod 2 (Response.Write): 0.031
Metod 3 (With Response): 0.109
Metod 4 (konkatenering): 12.531

P4 1.8 GHz, 512 Mb RAM. Det var lite skillnad, se...

Medlem sedan juni 20022 599 inlägg
#8

Sen kan man ju fråga sig om:

For i = 0 To 10000
	%>i=<%=i%>
|<%

verkligen ger 10000 context-switchar? Är det inte så att tolken "för-kompilerar" hela loopen en gång snarare än att tolka innehållet 10000 gånger?

Får man samma resultat om man skriver <%=nånting%> explicit 10000 ggr och jämför det med 10000 explicita response.write?

Medlem sedan maj 200010 687 inlägg
#9

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. :)

Medlem sedan juni 20022 599 inlägg
#10

Erik Juhlin skrev:

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.

Medlem sedan feb. 20001 590 inlägg
#11

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

XP, 1,2GHz (med Kazaa igång...)

Medlem sedan maj 200010 687 inlägg
#12

Hmm, jo ligger väl lite i det niko säger. Men hellre lite context-switchar som är lite långsammare än kluddig kod. :)

Kontakteneringen i VB/ASP är hemsk. Men vet någon om VBs kompilator inte kokatenerar hårdkodade strängar? Typ:

sql = "..." _
& "..."

Man tycker den borde sätta ihop det redan när den kompilerar. :)

Medlem sedan juni 20022 599 inlägg
#13

Erik Juhlin skrev:

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å".

Medlem sedan juni 20022 599 inlägg
#14

Erik Juhlin skrev:

Kontakteneringen i VB/ASP är hemsk.

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.

Här är ett exempel: http://www.vbaccelerator.com/home/VB/Code/Techniques/StringBuilder/String_Builder_Class_and_Demonstration_zip_cStringBuilder_cls.asp

Mycket snabbt om man har stora mängder konkateneringar.

Medlem sedan maj 200010 687 inlägg
#15

404... :(
Är det den gamla hederliga Sprintf funktionen som tas upp?

Medlem sedan juni 20022 599 inlägg
#16

Du får ta bort "%20" "<br%20/>" ur URL:en. wF envisas med att lägga till dem. Vet inte varför.

Är det den gamla hederliga Sprintf funktionen som tas upp?

Sprintf? Från C?

Medlem sedan apr. 20003 174 inlägg
#17

Metod 1 (context-switchar): 0,020
Metod 2 (Response.Write): 0,040
Metod 3 (With Response): 0,250
Metod 4 (konkatenering): 18,066

AMD Athlon TB 800mhz, 512mb ram.

Medlem sedan maj 200010 687 inlägg
#18

niko: Ja, vi har en sån funktion i vårt funktionsbibliotek. Har aldrig använts, men finns där ändå. :)

Medlem sedan feb. 20001 590 inlägg
#19

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.

Medlem sedan maj 200010 687 inlägg
#20

JScript gick långsammare i de testet som var på webForum.

276 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)