Guffa | Foto | Programmering

Optimeringstips

Här är lite tips för att få din ASP-kod snabbare och effektivare.

Option Explicit

Genom att sätta Option Explicit först i koden så ställer man in VBScript så att man måste dimensionera alla variabler. Dimensionerade variabler fungerar ungefär dubbelt så snabbt som om man inte dimensionerar dem. Själva kommandot Option Explicit gör inte koden snabbare, men det hjälper dig att se till att alla variabler är dimensionerade.

Option Explicit

Buffring

Se till att buffringen alltid är påslagen. Det gör att sidan skapas i minnet på servern och skickas till webbläsaren när den är färdig, istället för att det skickas ett paket varje gång en <%%>-tagg påbörjas.

I nyare versioner av IIS så är buffringen påslagen som standard, men du bör ändå alltid se till att den är påslagen. En obuffrad sida kan ta tio eller kanske till och med 100 gånger så lång tid att köra jämfört med om den vore buffrad.

Response.Buffer = True

Undvik Collection-objekt

Exempel på Collection-objekt är Request.Form och Request.Querystring. Att läsa ett värde ifrån ett Collection-objekt är relativt långsamt.

Nu kan man ju inte undvika att använda dessa objekt, eftersom det inte finns något alternativ. Däremot kan man använda dem så lite som möjligt. Ifall du kommer att använda ett värde mer än en enda gång så tjänar du på att lägga värdet i en variabel och sedan använda variabeln istället.

Exempel:
strName = Request.Form("name")

Använd inte select *

Hämta bara den data från databasen som du behöver. Ifall du använder "select *" i SQL-frågan så hämtas alla fält i tabellen, men man använder sällan mer än några få av dem.

Exempel: istället för detta:
strSQL = "select * from Messages"
så specificerar man vilka fält man vill hämta i recordsetet:
strSQL = "select MessageId,Title,Message,SentDate from Messages"

Använda insert- och update-frågor

Man kan använda ett Recordset-objekt för att uppdatera databasen, men det är effektivare att använda SQL-frågor som gör detta. För att uppdatera med Recordset-objektet måste man låsa tabellen för uppdatering när man öppnar den. När man kör en databasfråga för att uppdatera tabellen så låses den bara medan själva uppdateringen görs.

Exempel:
strSQL = "insert into Log (IP,LogTime) values ('" & Request.ServerVariables("REMOTE_ADDR") & "',"'" & Now() & "'")"
objConnection.Execute strSQL,,128

strSQL = "update Messages set ReadDate='" & Now() & "' where MessageId=" & lngMsgId
objConnection.Execute strSQL,,128

Stoppa recordset

När man kör en fråga mot databasen som inte skickar tillbaka något resultat, så bör man se till att det inte skapas något Recordset-objekt. Annars skapas det ett tomt recordset helt i onödan, som bara kastas bort.

Man ser till att inget recordset skapas genom att sätta flaggan 128 i anropet till Execute:

objConnection.Execute strSQL,,128

Skapa recordset med Connection.Execute

Ifall du bara ska läsa ifrån ett recordset, så kan du se till att få ett recordset som är optimerat för att just läsas från början till slut. Det gör du enklast genom att använda metoden Execute för att skapa recordsetet:

Set objRS = objConnection.Execute(strSQL)

Använd index för att läsa från recordset

Fälten som ligger i ett recordset är också ett Collection-objekt, och de skulle vi ju undvika. Till skillnad mot Request.Form och Request.Querystring så kan vi faktiskt undvika att använda namnen för att komma åt fälten i recordsetet.

Ifall vi specificerar vilka fält vi vill ha i recordsetet så vet vi precis i vilken ordning de ligger. Därmed kan vi komma åt värdena med index istället för namn. Ifall vi hämtar fältet MessageId först i frågan så får det index noll, så vi kan hämta ut värdet med rstMsg(0) istället för rstMsg("MessageId").

Nu blir ju koden svårare att tyda om det står siffror istället för namn på fälten, så för att få tillbaka tydligheten så kan man definiera konstanter för fälten i recordsetet. Det gör dessutom att det blir enklare att göra ändringar i koden. Ifall jag ändrar i databasfrågan så behöver jag bara se till att konstanterna stämmer, jag slipper gå igenom hela koden och ändra en massa siffror.

(I det här fallet så är alltså inte den snabbaste koden den bästa. Att hämta värdena från recordsetet med siffror istället för konstanter är aningen snabbare, men man förlorar så mycket läsbarhet i koden att det inte är värt det.)

Exempel:
strSQL = "select MessageId,Title,Message,SentDate from Messages"
Set rstMsg = objConnection.Execute(strSQL)

Const msg_Id = 0
Const msg_Title = 1
Const msg_Message = 2
Const msg_SendDate = 3

Response.Write rstMsg(msg_Title)

Göran Andersson