Jag har en sida där jag plockar ut och visar ganska mycket information ur en databas. Denna informationen listar jag rakt uppochner på en html sida som jag genererar med asp. Det är ca 300 poster som jag tar fram med ca 7-8 kolumner i varje post. Dessutom är dessa poster indelade i kanske 30-40 "grupper". Själva select-satsen är enkel, men det tar tid att loopa igenom hela recordsetet och generera alla ca 300 rader html-kod. Luddigt förklarat, jag vet, men jag plockar fram mitt recordset. Därefter skriver jag ut en rubrik, genererar 7-8 rader htmlkod med en post/7-8 kolumner på varje rad, därefter tom rad, rubrik, 7-8 rader igen osv tills jag har stegat igenom hela recordsetet. Jag har provat 3 olika sätt att göra detta för att hitta det snabbaste: 1:a metoden är inge bra alls... Nej, inte helt riktigt. Enligt ASP-Aliansen så tar den tekniken nästan lika lång tid. Jag använder mig av "SELECT * FROM tabellnamn WHERE x = 'blabla' ORDER BY y DESC;". Ungefär så. ;-) Sen går jag igenom detta med rs.MoveNext tills allt är klart. Getrows har jag aldrig testat eller satt mig in i hur det funkar. Använder just nu ACCESS databas men kommer byta till MySQL senare. Om ASP.Net skulle innebära en märkbar prestandaökning så kommer jag troligen byta till det med. MS påstår att .NET ska kickass, men har ingen större erfarenhet själv av det Om det nu är som så, att du har som mål att optimera din kod och samtidigt försöka att vinna lite tid, då finns det några saker till att uppmärksamma. > <b>Vad kan man göra för att får bästa prestanda på den här typen av sidor? </b> Det var många intressanta svar. Tack för dom. Jag får nog sätta mig och plugga lite om detta. Det verkar ju vara en hel del jag kan ändra på. Jag vill fortfarande se koden för hela sidan. Är inte nöjd fören jag har fått göra det. ;o) Hej Saw, här kan du optimera ytterligare! Ett sätt att optimera är att istället för att köra: Det ger en större prestanda vinst at använda Explecita fältvariabler: Sen är det ju det där med olika databaskopplingar, att dimma eller inte dimma variabler, option explicit eller inte, ASP eller ASP.net, ACCESS eller MySQL, mm mm. Det finns hur mycket som helst och jag vet inte vad som är bäst att göra :) Allra snabbast ska vara att ange position i stället för fältnamnet som index. DvsOptimera kod
1:a metoden:
En massa asp insprängt i htmlkoden.
<td><%=rs("kolumn1")%></td><td><%=rs("column2")%></td><td><%=rs("kolumn3")%></td>... osv.
Resultat: Mycket långsamt!
2:a metoden:
Innan jag har börjat skriva ut htmlkod på skärmen så genererar jag all htmlkod och sparar i en variabel med namn html. När det sen är dags för htmlkoden så avbryter jag htmlkoden EN gång med <%=Response.Write(html)%> Tanken var att färre växlingar mellan html och asp skulle snabba upp det hela. Resultat: OTROLIGT långsamt! Minneskrävande?
3:e metoden:
En mix av första och andra metoden. Genererar htmlkod som sparas i en variabel: Rubriken + följande 7-8 rader. Skriver sen ut den på skärmen. Genererar nästa, rubrik+efterföljande 7-8 rader. Skriver ut den på skärmen. Genererar nästa, osv... Resultat: Minst långsam.
Vad kan man göra för att får bästa prestanda på den här typen av sidor? Att dela upp informationen på flera sidor är tyvärr INTE ett alternativ. :-(
Om jag skulle konvertera sidan till ASP.Net, skulle detta då innebära några märkbara hastighetsförbättringar?Sv: Optimera kod
Om du ska använda asp så ska du helst använda:
<code>
<%
Response.Write "<td>" & rs("kolumn1") & "</td>"
Response.Write "<td>" & rs("kolumn2) & "</td>"
Response.Write "<td>" & rs("kolumn3") & "</td>"
Response.Write "<td>" & rs("kolumn4") & "</td>"
%>
</code>
nåt sånt är ju det bästa sättet...
Men sen så kan du ju göra det ännu snabbare genom att inte ha alla poster på en sida utan skapa ett sid script så att alla poster inte kommer med på en och samma sida..
Testa att ta kanske 25 rader med poster per sida...Sv: Optimera kod
De kom fram till att om du skriver allt i en sträng (så långt som möjligt) så blir det en stor prestandard ökning.
Jag har själv testat och kan inte annat än att hålla med:
<code>
<%
Response.Write "<td>" & rs("kolumn1") & "</td>" & _
"<td>" & rs("kolumn2) & "</td>" & _
"<td>" & rs("kolumn3") & "</td>" & _
"<td>" & rs("kolumn4") & "</td>"
%>
</code>
Så här blir det bäst.
Sen hänger väldigt mycket på din databashantering. Om du använder dig av GetRows, så vinner du kanonmycket. Jag har även testat de till bra resultat.Sv: Optimera kod
Sv: Optimera kod
Vad du kan göra ytterligare är att utnyttja Response objekt lite mer, istället för att tog lagra mastodont info i html variabeln kan du utnyttja Buffer och Flush metoderna i Response objekt...
Response.Buffer = True ' Buffrar alla data som ska skrivas till html-sidan
' kör dina
Response.Write "1"
Response.Write "1"
Response.Write "1"
'När raden är klar, skicka iväg den genom att anropa Flush metoden
Response.Flush
Det går även att modifiera den till att köra ut n antal rader i taget, på det sättet upplevs laddning av sidan gå snabbare, typ som laddninga av progressiva jpg bilder...
Det löser inte dina prestenda problem men de upplevs mindre på det sättet.
Fast det bästa tipset är att undersöka GetRows spåret, det är bäst, pellesoft har en bra artikel i ämnet, på nätet finns massvis med exempelSv: Optimera kod
Först. Skriv ALDRIG "select * from MinTabel", detta tar tid att utföra. Ta med alla de fält som du vill ha, på så sätt så får du inte med något onödigt.
GetRows, det är kanske det bästa som jag har stöt på. Jag skall visa ett litet exempel:
<code>
'detta är ett exempel ifrån en befintlig applikation
Dim con,rst,strSQL,arr
strSQL = "SELECT a_Id,Datum,Titel,Innehall FROM t_Arkiv Order BY Datum"
set rst= con.execute(strSQL)
If Not rst.EOF Then
arr=rst.GetRows()
rst.Close
con.Close
For i = 0 TO Ubound(arr,2)
sID=arr(0,i)
sDatum=arr(1,i)
sTitel=arr(2,i)
sInnehall=arr(3,i)
'Här visar jag innehållet ung så här
Response.Write sInnehall
NEXT
</code>
Innan detta så ligger det en data anslutning, och det finns ju mycket mera kod efter arrayen, men innan NEXT.
Ta och titta lite extra på detta, du kommer att bli vinnare.Sv: Optimera kod
Ett förslag du bör testa är att först hämta allt från databasen, och sedan skriva ut sidan! Tanken är att ha databaskopplingen öppen så kort tid som möjligt, och att hämtat datat i ett svep.
1) Öppna databasen.
2) Hämtat datat du vill ha.
3) För in datat i en array.
4) Stäng databasen.
5) Skriv ut HTML och hämta informationen från din array.Sv: Optimera kod
Sv: Optimera kod
Sv: Optimera kod
Du använder en funktion i en for-sats, den kan du lyfta ut
<code>
For i = 0 TO Ubound(arr,2)
sID=arr(0,i)
sDatum=arr(1,i)
sTitel=arr(2,i)
sInnehall=arr(3,i)
Response.Write sInnehall
Next
</code>
Genom att slå 1 gång istället för varje gång när du kontrollerar hur många poster det finns i arrayen så tjänar du mycket tid (om vi pratar millisekunder alltså) i kombination med många poster.
<code>
TotRecords = Ubound(arr,2)
For a = 0 to TotRecords
....
Next
</code>Sv: Optimera kod
rs("fält")
använda
rs.fields("fält").value
Har inte sett prestandaförbättringar "in action", men jag har "hört" att det skall förbättra....
(obs, gäller förstås inte när du kör mot arrayen, men jag inflikar ändå ifall någon är intresserad.. ;) )Sv: Optimera kod
<code>
Dim Rubrik
Set fldRubrik = rs("Rubrik")
Do Until rs.EOF
Response.Write "<h3>" & fldRubrik.Value & "</h3>"
rs.Move Next
Loop
</code>Sv: Optimera kod
Sv: Optimera kod
<code>
rs.Fields(0).Value
</code>
i stället för
<code>
rs.Fields("Rubrik").Value
</code>
Otympligt men snabbare...