Performance 在经典asp中创建对象时性能降低

Performance 在经典asp中创建对象时性能降低,performance,optimization,asp-classic,Performance,Optimization,Asp Classic,为了测试一个网站的性能,我创建了一个简单的日志子系统,以查看在执行经典asp页面时哪些部分速度较慢 sub log(logText) dim fs, f set fs = Server.CreateObject("Scripting.FileSystemObject") set f = fs.OpenTextFile("log.txt", 8, true) f.WriteLine(now() & " - " & logText) f.Clo

为了测试一个网站的性能,我创建了一个简单的日志子系统,以查看在执行经典asp页面时哪些部分速度较慢

sub log(logText)
    dim fs, f
    set fs = Server.CreateObject("Scripting.FileSystemObject")
    set f = fs.OpenTextFile("log.txt", 8, true)
    f.WriteLine(now() & " - " & logText)
    f.Close
    set f = Nothing
    set fs = Nothing
end sub

log "Loading client countries"
set myR = Server.CreateObject("ADODB.RecordSet")
myR.ActiveConnection = aConnection
myR.CursorLocation=2
myR.CursorType=3
myR.LockType=2
myR.Source = "SELECT * FROM CC ORDER BY ccName ASC"
log "Opening db connection"
myR.open()
log "Opened db connection"
以下是仅显示时间部分的结果:

...
11:13:01 - Loading client countries
11:13:06 - Opening db connection
11:13:06 - Opened db connection
...
创建ADODBRecordSet并设置一些属性大约需要5秒钟。这种情况并不总是发生,有时代码执行得很快,但通常是在我重新加载页面时 几分钟后,加载时间与示例大致相同。这真的是一个服务器/资源问题还是应该考虑改写代码?我最好的选择是用C语言编写,但在继续之前,我必须先研究这段代码

更新:我在收到第一条评论后添加了更多的代码,以呈现更多的代码。说明:代码创建了一个组合框选择菜单,其中包含检索到的国家/地区,并在上一段代码停止的地方继续

if not myR.eof then
    clientCountries = myR.getrows
    send("<option value='0'>Select country</option>")
    log "Creating combobox options"
    for i = 0 to ubound(clientCountries, 2)
        if cstr(session("clientCountry")) <> "" then
            if cstr(clientCountries(1, i)) = cstr(session("clientCountry")) then
                isSelected = "selected" else isSelected = ""
            end if
        end if
        if cstr(session("clientCountry")) = "" then
            if cstr(clientCountries(1, i)) = "23" then
                isSelected = "selected"
            else
                isSelected = ""
            end if
        end if
        optionString = ""
        optionString = clientCountries(2, i)
        send("<option value='" & clientCountries(1, i) & "' " & isSelected & ">" & convertToProperCase(optionString) & "</option>")
    next
    log "Created combobox options"
end if
myR.Close
myR.ActiveConnection.close
myR.ActiveConnection = nothing
set myR = nothing
log "Loaded client countries"

到目前为止,选择查询作为第2页或第3页查询的其余部分或多或少会在下一秒内执行。唯一使页面变慢的部分是您在日志的第一部分中看到的内容。我不确定是否可以分析SQLServer,因为我只有cPanel访问权限。这是我所知道的唯一方法,除非我还有其他东西可以看。

首先,检查您的连接字符串,我在某些提供商那里经历了较慢的时间。我为经典asp找到的最好的提供者是sqloledb

其次,在对GetRows数组执行For语句之前,我会关闭SQL对象。如果你不需要的话,你不想让它开着

第三,我会使用存储过程。通过节省编译时间,您将获得性能改进

第四,我将不惜一切代价避免执行SELECT*语句,而是只返回所需的列。您的代码看起来只需要2列

第五,我将在表上构建索引,这比预期的时间要长

如果这不能解决这个问题,我会考虑其他语言/解决方案。不确定数据集是什么样子的,所以不能说是否应该考虑平面文件数据库

另外,对记录集尝试此操作,看看会发生什么:

Set myR = Server.CreateObject("Adodb.Recordset")
myR.Open "SELECT * FROM CC ORDER BY ccName ASC", aConnection
If myR.RecordCount > 0 Then clientCountries = myR.GetRows()
myR.Close
Set myR = Nothing

If IsArray(myR) Then
  For ....

您是否尝试过分析SQL server?我会试试看你的选择到底花了多长时间。@NathanRice我已经用更多信息更新了问题,谢谢你看。猜测需要多长时间?类似的事情不应该超过几毫秒。一个小的改进:FOR循环中应该只有一个IF语句。交换它们并使用ELSE而不是second IF.@BlueSix不幸的是,根据我到目前为止的研究,通过经典asp是不可能的。connectionString如下所示:Provider=SQLNCLI11;Server=LOCALHOST\SQLEXPRESS;数据库=*****;Uid=*****;Pwd=*****;我刚刚辞掉这份工作,因为我无法向经理们讲道理,也无法向他们展示技术上的困难,但我仍然有机会说服他们让我来解决这个问题。但是,我想指出的是,我主要关心的是打开数据库之前花费的时间,因此我想连接提供程序是有意义的。我不知道是否可以使用其他提供商,因此我必须检查它是否可用或是否应该安装。无论如何,这终究会解决的,一定会尝试你的建议,谢谢!是的,你应该试试这个提供者,对我来说还不错:provider=sqloledb;数据源=本地;初始目录=MyDB;用户Id=***;密码=***;新雇佣的程序员尝试了您的解决方案,但不幸的是速度问题没有得到解决,因此这看起来更像是服务器资源问题。
Set myR = Server.CreateObject("Adodb.Recordset")
myR.Open "SELECT * FROM CC ORDER BY ccName ASC", aConnection
If myR.RecordCount > 0 Then clientCountries = myR.GetRows()
myR.Close
Set myR = Nothing

If IsArray(myR) Then
  For ....