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!" :)
20 svar · 1 775 visningar · startad av PatrikB
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*
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!" :)
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]
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 */
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
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*
.... det tycker jag ....
=O)
cya,
PatrikB
------------------
*Det jämnar ut sig sa han som sket i byxan och satte sig ned*
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*
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
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>", " ") & "</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
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*
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*
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]
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
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
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]
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*
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