webForumDet fria alternativet

Optimera kod!

10 svar · 663 visningar · startad av aleborg

aleborgMedlem sedan jan. 20013 341 inlägg
#1

Jag håller på att diskutera med en kund som har missat en del stängningar av databasen(MySQL). Jag gav ett exempel på smidig kod som jag anser vara optimerad! Kunden tyckte min var krånglig eftersom att man måste komma ihåg indexet i arrayn istället för <%=RS("Adress")%>. Han frågade mig vilken jag tyckte var smidigast av följande:

Kundens kod:

Variant 1:

<%
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
%>

Variant 2:

<%
Connection-sträng
SQL-fråga
' 10-20 rader HTML-kod
SQL-fråga
' 10-20 rader HTML-kod
SQL-fråga
' 10-20 rader HTML-kod
Connect.Close
%>

Min kod såg ut så här:

Funktionen samt connstr lägger du i en include
<%
'Hämta databas info
'-------------------------------------------------------------------------------
Function getDbRows( strCon, strSql )

                 Set Conn = Server.CreateObject("ADODB.Connection")
                 Conn.Open strCon

                 Set RS = Conn.Execute( strSql )
                 If RS.EOF Then
                         rader=null
                 Else
                         rader = RS.getrows
                 End If
                                
                 RS.close
                 Set RS = Nothing
                 Conn.Close
                 Set Conn=Nothing

                  getDbRows = rader

End Function

‘Databas sträng(koppling)
'--------------------------------------
connstr = "Driver={Mysql};Server=localhost;Database=databasen;UID=Användarnamn;PWD=lösenord"

 minArray = getDbRows(connstr, "Select Namn, Adress From Users")

If not IsNull(minArray) Then 
                 For i = 0 To Ubound(minArray,2)
%>
                 Namn: <%=minArray(0,i)%>
                 Adress: <%=minArray(1,i)%>
<%
Next
Else %>
Tomt I databasen
<% End If %>

Och självklart ska man Dimma allt!
Vad anser ni?

erkaMedlem sedan dec. 19996 522 inlägg
#2

Personligen gillar jag getrows, fungerar snabbt.Dock krångligt att se vad det är man skriver ut ibland. Av kundens alternativ är ju alternativ 2 det mest kloka,dumt att öppna databasen och stänga den hela tiden, tar mer prestanda

m_soderlundMedlem sedan sep. 20026 425 inlägg
#3

Din använder ju GetRows vilket är en fördel om databasen är stor. Men om du bara hämtar ut två fält kanske Recordset är bättre? Testa dig fram och mät tiden för exekvering med eller utan GetRows.

mrblondeMedlem sedan aug. 20012 349 inlägg
#4

en grej man kan göra är att skapa constanter som heter som fälten i databasen och ge dem värdet av samma fält i arrayen, då ser man rätt tydligt vad man hämtar i sin array och det ger en väldigt liten prestanda förlust. För att öka tydligheten.

Har för mig att det har diskuterats tidigare och att det finns en artikel på https://www.4guysfromrolla.com om detta.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#5

Jo, men om man returnerar recordsetet från ett com-objekt då? Ska man returnera ett dictionary med siffrorna då?

Blir inte det lika långsamt och ganska mycket krångligare då?

Dessutom så är det ju inte alltid GetRows är snabbare och inte ofta det ger någon större förbättring.

Se bara till att använda frånkopplade recordsets.

mrblondeMedlem sedan aug. 20012 349 inlägg
#6

Erik Juhlin skrev:

Jo, men om man returnerar recordsetet från ett com-objekt då? Ska man returnera ett dictionary med siffrorna då?

Blir inte det lika långsamt och ganska mycket krångligare då?

Det var väl mest en allmän idé man kan använda sig av i vissa fall och inte en universallösning jag hade :)

jupitersMedlem sedan sep. 2002104 inlägg
#7

Here are some sample benchmarks for three runs using
each method (not done under a controlled environment
but close enough to prove the point!):

---------------rs("fieldname") rs(x) 'set method'
Results: (in seconds) 2.967 1.650 0.586
Results: (in seconds) 2.824 1.611 0.602
Results: (in seconds) 2.893 1.613 0.594
-----------Average: 2.895 1.625 0.594

http://www.4guysfromrolla.com/webtech/120899-1.shtml

PatrikBMedlem sedan mars 20002 836 inlägg
#8

sälv har jag en annan variant:

'## -- skapa en global connection för hela sidan --

'## -- sql-fråga --
'## -- hämta poster som array --

'## -- sql-fråga --
'## -- hämta poster som array --

'## -- sql-fråga --
'## -- hämta poster som array --

'## -- stäng connection när jag har hämtat allt som behövs --

'## -- börja loopa igenom arrayerna på rätt ställe --

'## -- FUNCTIONERNA I EN INCLUDE FIL --

funktionen för att hämta records som array:

Function GetDbRows(query, cnn)
	Dim rst
	Set rst = cnn.Execute(query)
		If rst.EOF Then
			GetDbRows = null
		Else
			GetDbRows = rst.GetRows()
		End If
	Set rst = Nothing
End Function

likadant har jag funktioner (metoder) för att skapa connection, recordset (både vanliga och adodb.recordsets)

Mest optimerat? ... klart enkelt att "administrera" med en vettig felhantering.

cya,
PatrikB

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#9

Om man kollar på 4GuysFromRolla så tycker man ju att rs(0).Value borde vara lika snabbt som det senaste då.

PatrikBMedlem sedan mars 20002 836 inlägg
#10

Blir till att testa lite granna efter 4Guys modellen.

Tur man har "real world" info att testa med

cya,
/PatrikB

PatrikBMedlem sedan mars 20002 836 inlägg
#11

En annan sak som speedar upp hämtningar är att begränsa max antal poster som returneras. Till det krävs det ofta att man har en bra sökfunktion för att kunna "hitta rätt(a) post(er)".

Vilken nytta har användaren att 1000-tals poster returneras egentligen?

cya,
/PatrikB

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)