There are some performance tips, you can cache the response client-side (using HTTP Headers). Andalso before sending the response, you can use White Space Removal method for your output. Another point is compression: compress the reponse if the browser support it.
Sample of client-side caching (in VB):
Dim incomingEtag As String = context.Request.Headers("If-None-Match")
Dim freshness As New TimeSpan(100, 0, 0, 0)
context.Response.Cache.SetCacheability(HttpCacheability.Public)
context.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime.Add(freshness))
context.Response.Cache.SetMaxAge(freshness)
context.Response.Cache.SetValidUntilExpires(True)
context.Response.Cache.VaryByHeaders("Accept-Encoding") = True
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches)
Dim outgoingEtag As String = context.Request.Url.Authority & context.Request.Url.Query.GetHashCode()
context.Response.Cache.SetETag(outgoingEtag)
Sample of White Space Removel function for CSS:
Private Function StripWhitespace(ByVal body As String) As String
body = body.Replace(" ", " ")
body = body.Replace(Environment.NewLine, [String].Empty)
body = body.Replace(vbTab, String.Empty)
body = body.Replace(" {", "{")
body = body.Replace(" :", ":")
body = body.Replace(": ", ":")
body = body.Replace(", ", ",")
body = body.Replace("; ", ";")
body = body.Replace(";}", "}")
' sometimes found when retrieving CSS remotely
body = body.Replace("?", String.Empty)
'body = Regex.Replace(body, @"/\*[^\*]*\*+([^/\*]*\*+)*/", "$1");
body = Regex.Replace(body, "(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,}(?= )|(?<=&ndsp;)\s{2,}(?=[<])", [String].Empty)
'Remove comments from CSS
body = Regex.Replace(body, "/\*[\d\D]*?\*/", String.Empty)
Return body
End Function
Sample of White Space Removel function for JS:
Private Function StripWhitespace(ByVal body As String) As String
Dim lines As String() = body.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
Dim emptyLines As New StringBuilder()
For Each line As String In lines
Dim s As String = line.Trim()
If s.Length > 0 AndAlso Not s.StartsWith("//") Then
emptyLines.AppendLine(s.Trim())
End If
Next
body = emptyLines.ToString()
body = Regex.Replace(body, "^[\s]+|[ \f\r\t\v]+$", [String].Empty)
body = Regex.Replace(body, "([+-])\n\1", "$1 $1")
body = Regex.Replace(body, "([^+-][+-])\n", "$1")
body = Regex.Replace(body, "([^+]) ?(\+)", "$1$2")
body = Regex.Replace(body, "(\+) ?([^+])", "$1$2")
body = Regex.Replace(body, "([^-]) ?(\-)", "$1$2")
body = Regex.Replace(body, "(\-) ?([^-])", "$1$2")
body = Regex.Replace(body, "\n([{}()[\],<>/*%&|^!~?:=.;+-])", "$1")
body = Regex.Replace(body, "(\W(if|while|for)\([^{]*?\))\n", "$1")
body = Regex.Replace(body, "(\W(if|while|for)\([^{]*?\))((if|while|for)\([^{]*?\))\n", "$1$3")
body = Regex.Replace(body, "([;}]else)\n", "$1 ")
body = Regex.Replace(body, "(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,}(?= )|(?<=&ndsp;)\s{2,}(?=[<])", [String].Empty)
Return body
End Function
Here is a sample to compress the output:
Dim request As HttpRequest = context.Request
Dim response As HttpResponse = context.Response
Dim browserAcceptedEncoding As String = request.Headers("Accept-Encoding")
If Not String.IsNullOrEmpty(browserAcceptedEncoding) Then
browserAcceptedEncoding = browserAcceptedEncoding.ToLowerInvariant
If (browserAcceptedEncoding.Contains("gzip")) Then
response.AppendHeader("Content-encoding", "gzip")
response.Filter = New GZipStream(response.Filter, CompressionMode.Compress)
ElseIf (browserAcceptedEncoding.Contains("deflate")) Then
response.AppendHeader("Content-encoding", "deflate")
response.Filter = New DeflateStream(response.Filter, CompressionMode.Compress)
End If
End If