webForumDet fria alternativet

Lite små tester .....

ASP

20 svar · 1 775 visningar · startad av PatrikB

Medlem sedan mars 20002 836 inlägg
Frågan#1

Sökte lite här på forumet och hittade att många förespråkar detta och påstår att det går "snabbare":

Set objRS = objConn.Execute(strSQL)
Do Until objRS.EOF
strNamn = objRS("namn")
strText = objRS("body")
strOP = strOP & strNamn & "<BR>" & strText & "<BR><BR>"
objRS.MoveNext
Loop
Set objRS = Nothing

Response.Write strOP

Alltså, att lägga allt som kommer från recordsetet i en variabel och sedan skriva ut variabeln.

Den här koden skriver ut posterna direkt med Response.Write istället för att lägga posterna i en variabel:

Set objRS = objConn.Execute(strSQL)
Do Until objRS.EOF
strNamn = objRS("namn")
strText = objRS("body")
Response.Write strNamn & "<BR>" & strText & "<BR><BR>"
objRS.MoveNext
Loop
Set objRS = Nothing

he, he ... det visar sig att den senare varianten är något snabbare med mindre processor tid än den första.
OK, inga stora skillnader ... bara typ ett par millisekunder, men den är ändå snabbare *ler*

Kollar man sedan in hur man hämtar recordsetet på för vis så är skillnaderna riktigt intressanta.

Med ADODB.Recordset som utgångspunkt så får man att:

recordset skapat genom Connection (i.e: Set objRS = objConn.Execute(strSQL)) objektet är ca 13% snabbare än genom ADODB.Recordset
och getRows() metoden är ca 40 % snabbare än genom ADODB.Recordset.

OBS!! öppnade ADODB.recordset på detta viset:

objRS.Open strSQL, objConn

alltså med default värdena.

Vad blir kontentan av dessa uppgifter?
Jo, gör hämtningarna med .GetRows() metoden och loopa sedan igenom arrayen.
Som sagt, att loopa genom en array eller ett recordset spelar ju ingen roll. Det är fortfarande en loopning det är frågan om.

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan dec. 1999653 inlägg
#2

intressanta tester PatrikB, får jag fråga hur dessa är genomförda? :)

mvh.

------------------
void[]
stash/$gu&-public(querystring)/n int{}bind "2" "say i own!" :)

Medlem sedan mars 20002 836 inlägg
#3

hello,

visst får du det .... fast de är bara ca uppgifter. Finns mycket bättre sätt att testa. Men, tycker ändå att dessa är relativt korrekta. Använder man Webstress tools från MS så får man mycket bättre uppgifter.

Dessa uppgifter är gjorda med en enkle javascript funktion som hämtar en timestamp så att säga.

koden för timestamp:

<SCRIPT LANGUAGE=JScript RUNAT=Server>

function getMilliSec()   {
   var d = new Date();
      return d.getTime()
                  }
</script>

Sedan gjorde jag en timestamp för start tiden precis innan jag initierade recordsetet och en timestamp för slut tiden när jag satt objRS = Nothing.
Exempel:

		dteStartTime1 = getMilliSec()
		
				strSQL = "SELECT Id, namn, [datum] FROM gastbok"
				Set objRS = objConn.Execute(strSQL)
					If objRS.EOF Then
					
					Else
						Do Until objRS.EOF
							strNamn = objRS(1)
							dteDatum = objRS(2)
							Response.Write strNamn & ", " & dteDatum & "<BR>"
							objRS.MoveNext
						Loop
					End If
					objRS.Close
				Set objRS = Nothing

		dteEndTime1 = getMilliSec()

Response.Write (dteEndTime1 - dteStartTime1) & " ms."

Dessa tester jag utförde var mot en Access db med endast 25 poster i.
Gjorde precis liknande tester mot en annan db med ca 700 poster i och då vart skillnaderna mellan ADODB.Recordset hämtningen och hämtningen med Connection objectet endast 4% i skillnad och hör och häpna, .GetRows() metoden var hela ca 2,5 ggr snabbare än de andra metoderna.

OK, inte de perfektaste testresultaten, men man får en ganska snabb idee om vart exekveringstiden tar vägen med de olika metoderna :p

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

[Redigerat av PatrikB den 03 jun 2001]

Medlem sedan feb. 2001265 inlägg
#4

Hallå!
Intressanta testar må jag säga, men jag har en lite undran... Hur använder man GetRows? Aldrig kommit i kontakt med den innan!

------------------
---
/* LilleSkutt */

Medlem sedan feb. 2001390 inlägg
#5

kul att nån gör lite tester, fortsätt att jämnföra, typ ASP vs PHP :)

------------------
Rom byggdes inte på en dag - det tog en halv

Medlem sedan mars 20002 836 inlägg
#6

tyvärr kan jag inte själv göra dessa tester, mellan PHP och ASP då jag inte har ngn maskin som kör PHP och att jag ej kan PHP :(

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan dec. 19998 577 inlägg
#7

Hmm... man kanske skall göra ett test mellan ASP och ASP.NET... :e

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

Medlem sedan mars 20002 836 inlägg
#8

.... det tycker jag ....

=O)

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan mars 20002 836 inlägg
#9

Förresten,
en intressant sak.
Lägger man till någonform av Paging så är det, hör och häpna, ADODB.Recordset som vinner. ca 20 % snabbare än om man använder sig av ngn annan typ av paging genom conn objektet, om man vill ha enpagebar som ser ut så här:
<< Föregående | 1 2 3 4 5 | Nästa >>

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan feb. 2001265 inlägg
#10

Ingen som ville förklara? :(

------------------
---
/* LilleSkutt */

Medlem sedan dec. 19998 577 inlägg
#11

Det är PatrikB som experten här, så han får förklara... :)

Men jag kan fortsätta testerna med detta...

Senario:
Jag vill hämta fältet "test" ur en tabell och lista dessa i en tabell.

Jag använde två olika metoder: En loop för att lägga allt i en variabel, och ADO-funktionen GetString för att lägga allt i en variabel.

Skillnaden var fantastisk... :)

Loop: 3.0 Sekunder
GetString: 0.1 Sekunder

Ganska fet skillnad om jag får säga mitt...

Återkommer när jag testat GetRows med GetString. Självklart har dom inte samma användningsområden, men ändå.

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

Medlem sedan dec. 19998 577 inlägg
#12

Jahapp... Resultaten:

GetString: 0,09
Loop: 3,07
GetRows: 2,82

GetString: 0,1
Loop: 3,02
GetRows: 2,86

GetString: 0,1
Loop: 3,03
GetRows: 2,82

Jag låter dom tala för sig själv... :)

Såhär gjorde jag testet:

Alla metoderna använder samma SQL-sträng och Connectionobjekt.

GetString:

' Startar GetString
intStart = Timer()
Set rs = ConnObj.Execute(strSQL)
strTable1 = "<table><tr><td>" & rs.GetString(,,"</td><td>", "</td></tr><tr><td>", "&nbsp;") & "</td></tr></table>"
intGetString = Timer() - intStart

Loop:

' Startar Loop
intStart2 = Timer()
Set rs = ConnObj.Execute(strSQL)
strTable2 = "<table>"
Do until rs.EOF
	strTable2 = strTable2 & "<tr><td>"&rs("ip")&"</td></tr>"
	rs.MoveNext
Loop
strTable2 = strTable2 & "</table>"
intLoop = Timer() - intStart2

GetRows:

' Startar GetRows
intStart3 = Timer()
Set rs = ConnObj.Execute(strSQL)
arrRows = rs.GetRows()
strTable3 = "<table>"
For i = 0 To Ubound(arrRows,2)
	strTable3 = strTable3 & "<tr><td>"&arrRows(0,i)&"</td></tr>"
Next
strTable3 = strTable3 & "</table>"
intGetRows = Timer() - intStart3

Eller var detta orättvist kodat?

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

Medlem sedan mars 20002 836 inlägg
#13

jo, det var intressanta resultat.
FAst som sagt ... getString har ju en MYCKET begränsat användningsområde.
Bra att använda vid enkel tabell struktur tex.

En annan intressant sak är hur många poster som hämtas. skillnaderna är mycket stora vid större posthanteringar.

cya,
PatrikB ... som inte är expert på detta ... ännu :p

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan mars 20002 836 inlägg
#14

Vide ..

provade du att använda Response.Write oxå istället för att bygga på en variabel som sedan printas ut?
Den går faktiskt ngt fortare ... ;p ... fast inte fortare än getString(), men de 2 andra alternativen du använt.

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan feb. 2001265 inlägg
#15

Ok, putte kanske inte vill förklara för mig bara ;)

Har jag fattat det rätt om det är så här:
Tabell test
id | namn | epost

SQL = "SELECT * FROM test ORDER BY namn ASC"
set rs = connection.Execute(SQL)
arr = rs.GetRows()

for i = 0 to ubound(arr)
response.write "Namn: " & arr(1, i) & "E-post: " & arr(2, i)
response.write "<br>"
next

Rätt?

------------------
---
/* LilleSkutt */

[Redigerat av LilleSkutt den 03 jun 2001]

Medlem sedan dec. 19998 577 inlägg
#16

Nästan rätt... du måste ange vilken dimension du skall använda i Ubound:

SQL = "SELECT * FROM test ORDER BY namn ASC"
set rs = connection.Execute(SQL)
arr = rs.GetRows()
for i = 0 to ubound(arr,2)
response.write "Namn: " & arr(1, i) & "E-post: " & arr(2, i)
response.write "<br>"
next

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

Medlem sedan dec. 19998 577 inlägg
#17

provade du att använda Response.Write oxå istället för att bygga på en variabel som sedan printas ut?

Nope, jag är så van att inte blanda funktionskod med presentations kod. Och i detta test så skrev jag inte ut någonting... jag lade dem bara i variabler... Men visst det skall jag testa...

*testing*

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

Medlem sedan dec. 19998 577 inlägg
#18

Okej, med response i alla exempel blev resultatet såhär:

GetString: 0,12
Loop: 0,28
GetRows: 0,1

GetString: 0,1
Loop: 0,25
GetRows: 0,1

GetString: 0,1
Loop: 0,22
GetRows: 0,1

Antalet poster var 1308 stycken.

Här ser vi att GetRows och GetString är lika snabba i testet. Det är alltså inte ADO som är seg utan VBScriptens loop vid tilldelning av variabler.

Intressant.

Slutledning: använd GetString när det går och GetRows när du inte kan använda GetString...

Det är kul med tester... :)

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

[Redigerat av Vide den 03 jun 2001]

Medlem sedan mars 20002 836 inlägg
#19

visst är det ql med tester *ler*

LilleSkutt:
Sorry, missade ditt inlägg .... :(

cya,
PatrikB

------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*

Medlem sedan feb. 20001 590 inlägg
#20

Vide->
' Startar GetString
Set rs = ConnObj.Execute(strSQL)
intStart = Timer()
strTable1 = "<table><tr><td>" & rs.GetString(,,"</td><td>", "</td></tr><tr><td>", " ") & "</td></tr></table>"
intGetString = Timer() - intStart

Om du flyttar ner intStart initieringen efter databasexekveringen, så får du ett bättre mätvärde, om det är åtkomsttiden man ska mäta.
Databasexekveringen kan ta olika tider, beroende på systemet. Det har jag själv råkat ut för.
Sedan bör (SKA) man använda en komponent för tidtagningen, eftersom scriptet i sig inte ger en korrekt tid, det är bättre att låta en separat komponent använda systemklockan. (nu kanske det är så du gjort iof)

/T

------------------
This is what the KLF is about

288 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
153 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)