webForumDet fria alternativet

Prestanda okning a sa....

ASP

17 svar · 649 visningar · startad av crisse6

Medlem sedan dec. 20002 526 inlägg
Frågan#1

Hej!

Nu vill jag ha hjalp med hur jag kan fa min kod snabbare.... dvs prestandaokning... tror inte den ar den basta nu och lite rorig!
(LAAANG)

[red]
<%
'### Databaskoppling
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("forum.mdb")

	If request.form("forum") = "" then

	set rs = Server.CreateObject("Adodb.Recordset")
	sql = "SELECT threadID, f_title, f_by, f_user, f_latest, f_answers, f_dte, svarID, f_anno " &_
	" from t_threads " & _
	" where ForumID = "& request.querystring("forumID") &_
	" and f_title <> '' and f_title is not null " & _
	" ORDER BY f_latest Desc"

	else

	set rs = Server.CreateObject("Adodb.Recordset")
		sql = "SELECT threadID, f_title, f_by, f_user, f_latest, f_answers, f_dte, f_status, svarID, f_anno " &_
		" from t_threads " & _
		" where ForumID = "& request.form("forum") &_
		" and f_title <> '' and f_title is not null and f_dte = "& request.form("visa") &"" & _
	" ORDER BY f_latest Desc"

	end if

	sql2 = "SELECT COUNT(*) AS antal FROM t_threads Where forumID= "& request.querystring("forumID") &" AND f_title <> '' and f_title is not Null"
	set rs2 = objConn.execute(sql2)

	sql3 = "select * from t_forum"
	set rs3 = objConn.execute(sql3)

	'### startar paging
IntPageId = request.querystring("pageid")
if intPageId = "" then intPageId = 1

With rs
	.cursorlocation = 3
	.open sql, objConn
end with

If rs("f_anno") = "Viktig" then
typ = "<table width=""620"" bgcolor=""#EFEFEF"" cellspacing=""2""><tr>"&_
		"<td width=""20"" align=""left""><font face=""Verdana"" size=""2""></td>"&_
		"<td width=""250"" align=""left""><font face=""Verdana"" size=""2""><b><a href=""read.asp?forumID="& request.querystring("forumID") &"&tradID="& rs("threadID") &"&svarID="& rs("svarID") &""">"& rs("f_titel") &"</a></b></font></td>"&_
		"<td width=""150"" align=""left""><font face=""Verdana"" size=""2""><a href=""info.asp?userid="& rs("f_user") &""">"& rs("f_by") &"</a></font></td>" &_
		"<td width=""100"" align=""center""><font face=""Verdana"" size=""2"">"& rs("f_answers") &"</font></td>" &_
		"<td width=""100"" align=""right""><font face=""Verdana"" size=""1"">"& rs("f_dte") &"<br><a href=""info.asp?userid="& rs("f_by") &"""><b>"& rs("f_by") &"</b></a></font></td></table>"
else
typ = "Inget viktigt att raportera!"
end if

'inkluderar meny knappar
%>
<!--#include file="include_meny.asp" -->
<%
postDate = cdate(rs("f_latest"))
days = datediff("d",postDate,now())
if days = 0 then
yesterday = "Idag  " & FormatDateTime(postDate,3)
elseif days = 1 then
yesterday = "Igår " & FormatDateTime(postDate,3)
else
yesterday = rs("f_latest")
end if
	'If rs.eof then
		'Response.write "<font face=""Verdana"" size=""2""><i>Inga tradar i detta forum!</font></i>"
	'else
With rs
	.pagesize = 10
	.absolutepage = intPageId
end with

intPages = cint(rs.pagecount)
intCurrentPost = 0
		response.write "<table width=""620"" background=""top_tabell.gif"" bgcolor=""#737373"" cellspacing=""2""><tr>" &_
		"<td width=""20""></td>" &_
		"<td width=""250""><font face=""Verdana"" size=""1""><b><center>Thread:</center></b></font></td>" &_
		"<td width=""150""><font face=""Verdana"" size=""1""><b>Startad av:</b></font></td>" &_
		"<td width=""100""><font face=""Verdana"" size=""1""><b>Antal svar:</b></font></td>" &_
		"<td width=""100""><font face=""Verdana"" size=""1""><b>Senast svar:</b></font></td></table><br>"& typ &""&_

titel = rs("f_title")
	function punkter(titel)
		if Len(titel) > 50 then
		punkter = "..."
		end if
	end function

do while not rs.eof and intCurrentPost < rs.pagesize

		if bgcolor = "#FFFFFF" then
		bgcolor = "#3399CC"
		else
		bgcolor = "#FFFFFF"
		end if

	minska = Left(rs("f_title"),50)

		strContents = strContents &_
		"<table width=""620"" bgcolor="&bgcolor&" cellspacing=""2""><tr>" &_
		"<td width=""20"" align=""left"" cellspacing=""2""></td>" &_
		"<td width=""250"" align=""left""><font face=""Verdana"" size=""2""><a href=""read.asp?forumID="& request.querystring("forumID") &"&tradID="& rs("threadID") &"&svarID="& rs("threadID") &""">"& minska &""& punkter(titel) &"</a></font></td>" &_
		"<td width=""150"" align=""left""><font face=""Verdana"" size=""2""><a href=""info.asp?userid="& rs("f_user") &""">"& rs("f_user") &"</a></font></td>" &_
		"<td width=""100"" align=""center""><font face=""Verdana"" size=""2"">"& rs("f_answers") &"</font></td>" &_
		"<td width=""100"" align=""right""><font face=""Verdana"" size=""1"">"& yesterday &"<br><a href=""info.asp?userid="& rs("f_by") &"""><b>"& rs("f_by") &"</b></a></font></td></table>"
	intCurrentPost = intCurrentPost +1
rs.movenext
loop

function getPreviousLink(intPageId)
		if intPageId > 1 then
		getPreviousLink = "<a href=""thread.asp?pageid="& intPageId -1 & "&forumID="& request.querystring("forumID") &""">&lt;&lt; Previous</a>"
		end if
	end function

	function getNextLink(intPageId, intPageCount)
		if cint(intPageId) < cint(intPageCount) then
		getNextLink = "<a href=""thread.asp?pageid="& intPageId +1 &"&forumID="& request.querystring("forumID") &""">Next &gt;&gt;</a>"
		end if
	end function

strNavigation = getPreviousLink( intPageId ) & " "

	for i = 1 to rs.pagecount

	strNavigation = strNavigation & "&nbsp;<a href=""thread.asp?pageid="& i &"&forumID="& request.querystring("forumID") &""">"& i &"</a>"
	next

strNavigation = strNavigation & " " & getNextLink( intPageId, intPages ) & " "

response.write "<font face=""Verdana"" size=""2"">"& strContents &"</font>"
response.write "<br><font face=""Verdana"" size=""2"">"& strNavigation &"</font>"

	%>
<br><hr size="1" color="#000000">
<%
If rs2("antal") = "1" then
response.write "<font face=""Verdana"" size=""2"">Det ar <b>"& rs2("antal") &"</b> trad inom " & request.querystring("titel") &" forumet</font>"
else
response.write "<font face=""Verdana"" size=""2"">Det ar <b>"& rs2("antal") &"</b> tradar inom " & request.querystring("titel") &" forumet</font>"
end if
%>
<form name="order" method="get" action="thread.asp?forumID=<%=request.querystring("forumID")%>&">
<font face="Verdana" size="1">Visa:&nbsp;
<SELECT NAME="visa">
<OPTION VALUE="0">Alla inlagg
<OPTION VALUE="1">Idag
<OPTION VALUE="5">Fran 5 dagar
<OPTION VALUE="30">Fran 30 dagar
<OPTION VALUE="100">Detta ar
</SELECT>
<input type="submit" value="Visa">
</form>
&nbsp;Forum:
<%
with response
.write "<form name=""bytaforum"" method=""get"" action=""thread.asp"">"
.write"<SELECT NAME=""forumID"">"
end with

do until rs3.eof
with response
	.write"<OPTION VALUE="""& rs3("forumID") &""">"& rs3("f_title") &""
end with

	rs3.movenext
	loop
with response
	.write"</select>"
	.write"<input type=""submit"" value=""Byt forum"">"
	.write"</form></font>"
end with
response.write request.form("forum")
%>

Hehehe!

Medlem sedan sep. 2002104 inlägg
#2

istället för rs("antal") i en loop, och om detta är sjätte fältet i dbtabellen är det bättre(prestandamässigt) att skriva rs(5).
Const antal = 5
rs(antal)
eller ännu bättre sätta en referens till dbfältet:
dim objAntal
set objAntal = rs(antal)
http://www.4guysfromrolla.com/webtech/120899-1.shtml

Medlem sedan dec. 20002 526 inlägg
#3

okey! tack! nagot mer?

Medlem sedan aug. 20012 349 inlägg
#4

Använda option explicit, dimma dina variabler.
Använd inte "with response" eller "with rs", skriv response.wite direkt. Det är rejäl skillnad.

Medlem sedan feb. 200112 078 inlägg
#5

Jag har för mig att with faktiskt ökar prestanda.

Medlem sedan aug. 20012 349 inlägg
#6

Hmmm...

Jag genomförde lite tester, som iofs var med contextswitch utskrifter, och kom fram till att with gick på t ex: 1,3 sekunder och reponse.write direkt på 0,3 sekunder.

Utan att gå in på testet i detalj eller något annat. Men det verkade som att With alltid var väldigt mycket långsammare...

Det kan ju vara så att det i andra fall är snabbare. Jag har ju haft fel förr, så varför inte nu igen :)

Enklast är väl att testa, sätt en timer på sidan och se vad det tar, byt sen till utan with och kolla skillnaden.

Om du orkar crisse6...

Medlem sedan aug. 20012 349 inlägg
#7

Ett annat sätt att öka prestnadan är att ta sina sql satser och köra i t ex queryanalyzern och se om den kan komma med förslag på index, eller annat bra. Detta funkar dock dåligt i Access som jag ser att du använder nu när jag kollade efter. Men har man SQL server är det verkligen värt det extra jobbet. Det är bra att se till att man bara hämtar ut den data man behöver, dvs inte en select * om man bara skall ha ett fält. Att kanske köra en Join istället för and ditt = datt and dutt = plutt osv osv... Join är snabbare.

Medlem sedan dec. 20002 526 inlägg
#8

okey... japp, tankte pa join ocksa... men vet inte riktigt hur jag ska fa ihop dom?

Medlem sedan feb. 200112 078 inlägg
#9

Det är ju inte jag som är SQL-gurun här omkring, men jag ser inte direkt att det finns någonstans i den där koden där en JOIN får plats. :)

Medlem sedan dec. 20002 526 inlägg
#10

far plats?! Det borde val ga att trycka in, sjalv vet jag inte...

Medlem sedan feb. 200112 078 inlägg
#11

Alltså, en JOIN är något som händer när du jämför data mellan två tabeller, vilket du i något av dessa fall faktiskt inte gör.

Därför behöver den där koden inte någon JOIN. :)

Jag har kikat lite extra på det, och jag ser verkligen inte någonstans du kan ha en join. Men återigen, så är ju inte jag SQL-experten. ;)

Medlem sedan sep. 2002104 inlägg
#12

jag har fått lära mig att det är bättre att skriva:

response.write "</select><input type=""submit"" value=""Byt forum""></form></font>"

jämfört med att anropa write-metoden tre gånger

with response
.write"</select>"
.write"<input type=""submit"" value=""Byt forum"">"
.write"</form></font>"
end with

Medlem sedan aug. 20012 349 inlägg
#13

Här är ett exempel på ett enkelt prestanda test som testar tre olika typer av utskrifter mot skärm.

Metod 1 (context-switch) gav tiden: 0.291
Metod 2 (Response.Write) gav tiden: 0.311
Metod 3 (With Response) gav tiden: 1.553

Detta på en laptop med win2k, iis5, 512 i minne

Det är ju inte ett allmängiltigt test, men det verkar ge en viss pekpinne åt vad som är bäst... alla som jag känner som har kört testet får radiklat sämre tider för With Response metoden, och ungefär samma för de två andra.

<%
Option Explicit
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
	<title>Untitled</title>
</head>

<body>

<%
Dim dInitTime, fPeriod, n
dInitTime = Timer

'--## Metod 1
For n = 1 To 500000
     %>.<%
Next

fPeriod = FormatNumber(Timer - dInitTime, 3, True)
Response.Write "<br>Metod 1 (context-switch) gav tiden: "& fPeriod &"<br><br>"
dInitTime = Timer

'--## Metod 2
For n = 1 To 500000
     Response.Write "."
Next

fPeriod = FormatNumber(Timer - dInitTime, 3, True)
Response.Write "<br>Metod 2 (Response.Write) gav tiden: "& fPeriod &"<br><br>"
dInitTime = Timer

'--## Metod 3
With Response
     For n = 1 To 500000
     .Write "."
     Next
End With

fPeriod = FormatNumber(Timer - dInitTime, 3, True)
Response.Write "<br>Metod 3 (With Response) gav tiden: "& fPeriod &"<br><br>"

%>

</body>
</html>
Medlem sedan dec. 20002 526 inlägg
#14

japp.... visar ju att response.write ar snabbare. Jag har alltid anvant response.write och har inte hort om att kora with response skulle vara snabbare sa...

Medlem sedan maj 2001431 inlägg
#15

Jag modifierade din kod en smula

'--## Metod 1
For n = 1 To 5000
     %>.
     <%=Request.ServerVariables("SCRIPT_NAME")%>
     <%
Next

fPeriod = FormatNumber(Timer - dInitTime, 3, True)
Response.Write "<br>Metod 1 (context-switch) gav tiden: "& fPeriod &"<br><br>"
dInitTime = Timer

'--## Metod 2
For n = 1 To 5000
     Response.Write "." & Request.ServerVariables("SCRIPT_NAME")
Next

fPeriod = FormatNumber(Timer - dInitTime, 3, True)
Response.Write "<br>Metod 2 (Response.Write) gav tiden: "& fPeriod &"<br><br>"
dInitTime = Timer

'--## Metod 3
With Response
     For n = 1 To 5000
     .Write "." & Request.ServerVariables("SCRIPT_NAME")
     Next
End With

och fick följande resultat under IIS4/NT4sp6

Metod 1 (context-switch) gav tiden: 1,688
Metod 2 (Response.Write) gav tiden: 1,203
Metod 3 (With Response) gav tiden: 1,172

Medlem sedan juni 20019 024 inlägg
#16

mrblonde skrev:

Här är ett exempel på ett enkelt prestanda test som testar tre olika typer av utskrifter mot skärm.

Metod 1 (context-switch) gav tiden: 0.291
Metod 2 (Response.Write) gav tiden: 0.311
Metod 3 (With Response) gav tiden: 1.553

Detta på en laptop med win2k, iis5, 512 i minne

Det är ju inte ett allmängiltigt test, men det verkar ge en viss pekpinne åt vad som är bäst... alla som jag känner som har kört testet får radiklat sämre tider för With Response metoden, och ungefär samma för de två andra.

Jag har då aldrig haft behovet av att skriva ut 5 000 punkter efter varandra plus sökvägen så då är testet väldigt orealistiskt. Lägg till alla konkanteneringar som görs på "Response.Write" så ska du se att du får ett annat resultat.

Dessutom är det ganska lite resurser som går åt till att skriva ut data på detta viset. Snarare är det på sättet man hämtar data som är problemet, kanske man har databasen öppen samtidigt som man skriver ut det?

Jag körde alltid With Response för att det är lättare att läsa, om det visar sig 10 millisekunder slöare skiter jag i, då får jag väl cacha sidan istället.

r) Låt bli att skapa tre olika recordsets och håll dig till ett istället. Om du behöver skriva samma sak två gånger så har du också gjort fel (tänker på de två första SQL-satserna som är näst intill lika) - lägg i en funktion och retunera olika beroende på värdet istället.

Medlem sedan aug. 20012 349 inlägg
#17

För att citera mig själv

Jag har ju haft fel förr, så varför inte nu igen

Jag påstod inte att mitt test var allmängiltigt. Men det är intressant att man får väldigt olika resultat beroende på vad man gör, och hur man gör det.

Kan ju vara något att fundera på, så att man väljer rätt metod vid rätt tillfälle.

Om prestanda tvistar de lärda, de köpta och de okunnigna, så vi lär ju aldrig komma fram till rätt svar. :e

Det enda man kan göra är att time:a sin sida och sen försöka förbättra än det ena och än det andra och se om det hjälper. Prova sig fram helt enkelt.

Medlem sedan juni 20019 024 inlägg
#18

Jag påstod inte att mitt test var allmängiltigt. Men det är intressant att man får väldigt olika resultat beroende på vad man gör, och hur man gör det.

Precis, gör man inte. :e
Skämt åsido, jag förstår vad du menar.

263 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)