Today I was tasked to improve the performance of a classic ASP page. Rewriting the code in ASP.NET is at this moment not an option so I took up the challenge to squeeze every ounce of performance I can get out of the page.
The page consists of the basic "SELECT bla bla FROM bla" into a couple of recordssets. A while loop iterates through those recordsets and dumps <tr><td> strings. Within the while loop there is a bunch of conditionals and whatnot. There are 3 subroutines that are called which use global variables (not local variables passed as parameters).
So nothing really shocking or anything. Before I started my optimization the loop took around 15 seconds to complete. Of the 15 seconds around 6 were taken up by the sql query.
After changing a few things around I managed to get it around to 7 seconds.
The things that I have changed around are:
Instead of doing SELECT *, I selected only the columns that I needed. The query went down to on average 4 seconds. It's a pretty heavy query with views within views.
I removed all the context switching within the loop. So I changed things like <%= bla %> to Response.Write(bla).
The 3 subroutines were defined as functions, but they were used as sub (with no result). So I changed the functions to subs. Does that help?
After making my changes I found that most of the time was taken up by one of the subroutines. I didn't have time enough today to change the subroutine, but it consists of things like:
With every page call, that subroutine is run around 1600 times.
Anybody out there have any experience with optimizing classic asp pages? Do you have any good tips for optimization? What I'm looking for is improvement of code within a do ... loop statement.
I'm an experienced ASP.NET developer and know quite a bit about perfomance improvement in ASP.NET. Classic ASP uses a different "engine" so I was wondering if anybody out there have any insights into improving the performance of classic ASP.
Thanks!
M
PS: Yes I know that classic ASP uses VBScript
It used scripting on the server to create content that would then be sent to a client's web browser, and as a result it enjoyed a tremendous amount of success. Classic ASP, however, is no longer being developed by Microsoft at all – it has long since been replaced by ASP.NET in 2002, a newer alternative.
First, it should be noted that the end of life (EOL) for classic ASP is 2025. This is because there are still numerous websites that use it.
Active Server Pages or Classic ASP, as it is more commonly known, is Microsoft's first server side scripting engine that enables you to make dynamic and interactive web pages.
Click Start, and then click Control Panel. In Control Panel, click Programs and Features, and then click Turn Windows Features on or off. Expand Internet Information Services, then World Wide Web Services, then Application Development Features. Select ASP, and then click OK.
GetRows This will create the speed you seek. Here are some other tips I have used.
Seeing that this is a popular question I've decided to explain what I did 3 years ago that sped up the ASP script.
The original script made heavy use of resizable arrays in order to store key-values, so I modified that code to use Scriting.Dictionary. Example:
Dim myDictionary
Set myDictionary = Createobject("Scripting.Dictionary")
myDictionary.item("key") = "value"
That is a lot faster then resizable arrays.
Another big change is the concatenation of strings. The original script was full of:
S = ""
S = S & "First line<br />"
S = S & "Second line<br />"
S = S & "Third line line<br />"
Response.Write(S)
I modified this to:
Response.Write("First line<br />")
Response.Write("Second line<br />")
Response.Write("Third line<br />")
This made a huge difference. The concatenation of strings is a huge bottleneck because the string is thrown away and then reinitialized.
Another option is:
S = "First line<br />" & _
"Second line<br />" & _
"Third line line<br />"
Response.Write(S)
This is also a good tip for ASP.NET: Use a StringBuilder instead of concatenating strings.
Another important change is context switching. The original code was full of:
<table>
<tr>
<td><%= rs("Col1") %></td>
<td><%= rs("Col2") %></td>
<td><%= rs("Col2") %></td>
</tr>
</table>
The 3 context switches take up a lot of time so I modified to this:
<%
Response.Write("<table>")
Response.Write("<tr>")
Response.Write("<td>")
Response.Write(rs("Col1"))
Response.Write("</td>")
Response.Write("</tr>")
Response.Write("<tr>")
Response.Write("<td>")
Response.Write(rs("Col2"))
Response.Write("</td>")
Response.Write("</tr>")
Response.Write("<tr>")
Response.Write("<td>")
Response.Write(rs("Col3"))
Response.Write("</td>")
Response.Write("</tr>")
Response.Write("</table>")
%>
Yes the code is very redundant but it performs better.
Another small modification (which is actually a dirty hack) is to use WITH (NOLOCK) in your SQL queries:
conn.Query("SELECT * FROM MyTable WITH (NOLOCK) LEFT JOIN AnotherTable WITH (NOLOCK) ON MyTable.Id = AnotherTable.Id")
It makes a difference.
Finally, I don't know if that helps much, but there was a lot of copy-pasted code that I refactored into clean functions.
I hope that people finding this thead will find these tips useful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With