ASP-Classic - 为 class 中的字段赋值真的很慢,因为今年最近的 windows 更新之一
ASP-Classic - Assigning values to fields in a class really slow since one of the recent windows updates this year
今年早些时候我的一位同事开发环境出现问题,我调查了这个问题并找出了问题所在。他和我的机器唯一的主要区别是我没有 运行 windows 更新。从那时起我的电脑强制更新,现在我的机器上出现了这个问题。
我们都是 运行ning windows 10 pro, IIS 10.0.17132.1.
问题。在 classic asp 中,将值分配给 class 字段或从字段中读回值时,现在花费的时间比预期的要长很多。
使用 public 或私有(使用 getters / setters)对速度没有影响。
我已经在我们的一台服务器上测试了这个问题,它没有受到这个问题的影响。它的性能与我之前的机器非常相似。
我在下面包含了我的测试脚本。这是我们看到的测试结果。
服务器计时。
计数:100000,分配时间:0.359375,测试时间:0.222656,其他时间:0.527344,总时间:1.109375,错误:0.
当地时间。
计数:100000,分配时间:14.07813,测试时间:13.73438,其他时间:0.460938,总时间:28.27344,错误:0.
<%
dim t, startTime, totalTime, assignTime, testTime, otherTime, n, max, classArray(), data, testVal, errors
class mytest
public myval
end class
startTime = timer
assignTime = 0
testTime = 0
max = 100000
if isEmpty(request("max")) = false and isNumeric(request("max")) = true then max = cLng(request("max"))
if max < 1 then max = 1
errors = 0
redim classArray(max)
for n = 1 to max
set data = new mytest
t = timer
data.myval = "test_" & n
assignTime = assignTime + (timer - t)
set classArray(n) = data
next
for n = 1 to max
set data = classArray(n)
t = timer
testVal = data.myval
testTime = testTime + (timer - t)
if testVal <> "test_" & n then
errors = errors + 1
end if
next
totalTime = (timer - startTime)
otherTime = totalTime - assignTime - testTime
response.write "Count: " & max & ", "
response.write "Assign time: " & round(assignTime, 6) & ", "
response.write "Test time: " & round(testTime, 6) & ", "
response.write "Other time: " & round(otherTime, 6) & ", "
response.write "Total time: " & round(totalTime, 6) & ", "
response.write "Errors: " & errors & "."
%>
从调查中,我还看到问题似乎是对 class 的调用,而不是 class 中数据的应用。
将我的 class 调整为具有两个字段并制作一个同时设置两个字段的函数(或将两者作为数组读出)。手动设置它们所花费的时间是调用一个函数来同时设置两者的时间的两倍。读回数据具有相同的效果。
<%
class mytest
public myval
public myval2
public function setdata(v1, v2)
myval = v1
myval2 = v2
end function
public function getdata()
getdata = array(myval, myval2)
end function
end class
set data = new mytest
data.myval = "test"
data.myval2 = "test2"
set data = new mytest
call data.setdata("test", "test2")
%>
我花了几个小时在网上搜索与此相关的任何内容,但找不到任何内容。
所以,
还有其他人看到过这个问题吗?
它会影响其他人的开发环境吗?
有人知道如何解决这个问题吗?
感谢@erik
我想给你点赞,但你的评论旁边似乎没有向上箭头。但非常感谢。
是的,服务器上 vbscript.dll 的版本不同。我已经在我的开发环境和我同事的机器上替换了那些 DLL,问题就消失了。我们正在监视日志以查看使用服务器 DLL 是否有任何不利影响,但到目前为止一切看起来都很好。
我必须先从 TrustedInstaller 获取 DLL 的所有权,然后才能替换它们,但之后一切顺利,不确定我是否必须这样做,但我在完成后将所有权归还给 TrustedInstaller。
服务器和我们的开发机器都已 windows 更新,所以我假设 DLL 差异是平台特定的,或者可能是 Windows 10 中他们想要解决但未放入版本中的内容他们在更新时推送到服务器。
详情。
system32\vbscript.dll
Windows 10 DLL 25/07/2018 17:31(版本 5.812.10240.16384)
Windows 服务器 2012R2 DLL 19/07/2018 05:33(版本 5.8.9600.19101)
syswow64\vbscript.dll
日期和版本都与 system32 相同(文件大小不同,但这是可以预料的)。
今年早些时候我的一位同事开发环境出现问题,我调查了这个问题并找出了问题所在。他和我的机器唯一的主要区别是我没有 运行 windows 更新。从那时起我的电脑强制更新,现在我的机器上出现了这个问题。
我们都是 运行ning windows 10 pro, IIS 10.0.17132.1.
问题。在 classic asp 中,将值分配给 class 字段或从字段中读回值时,现在花费的时间比预期的要长很多。
使用 public 或私有(使用 getters / setters)对速度没有影响。
我已经在我们的一台服务器上测试了这个问题,它没有受到这个问题的影响。它的性能与我之前的机器非常相似。
我在下面包含了我的测试脚本。这是我们看到的测试结果。
服务器计时。 计数:100000,分配时间:0.359375,测试时间:0.222656,其他时间:0.527344,总时间:1.109375,错误:0.
当地时间。 计数:100000,分配时间:14.07813,测试时间:13.73438,其他时间:0.460938,总时间:28.27344,错误:0.
<%
dim t, startTime, totalTime, assignTime, testTime, otherTime, n, max, classArray(), data, testVal, errors
class mytest
public myval
end class
startTime = timer
assignTime = 0
testTime = 0
max = 100000
if isEmpty(request("max")) = false and isNumeric(request("max")) = true then max = cLng(request("max"))
if max < 1 then max = 1
errors = 0
redim classArray(max)
for n = 1 to max
set data = new mytest
t = timer
data.myval = "test_" & n
assignTime = assignTime + (timer - t)
set classArray(n) = data
next
for n = 1 to max
set data = classArray(n)
t = timer
testVal = data.myval
testTime = testTime + (timer - t)
if testVal <> "test_" & n then
errors = errors + 1
end if
next
totalTime = (timer - startTime)
otherTime = totalTime - assignTime - testTime
response.write "Count: " & max & ", "
response.write "Assign time: " & round(assignTime, 6) & ", "
response.write "Test time: " & round(testTime, 6) & ", "
response.write "Other time: " & round(otherTime, 6) & ", "
response.write "Total time: " & round(totalTime, 6) & ", "
response.write "Errors: " & errors & "."
%>
从调查中,我还看到问题似乎是对 class 的调用,而不是 class 中数据的应用。
将我的 class 调整为具有两个字段并制作一个同时设置两个字段的函数(或将两者作为数组读出)。手动设置它们所花费的时间是调用一个函数来同时设置两者的时间的两倍。读回数据具有相同的效果。
<%
class mytest
public myval
public myval2
public function setdata(v1, v2)
myval = v1
myval2 = v2
end function
public function getdata()
getdata = array(myval, myval2)
end function
end class
set data = new mytest
data.myval = "test"
data.myval2 = "test2"
set data = new mytest
call data.setdata("test", "test2")
%>
我花了几个小时在网上搜索与此相关的任何内容,但找不到任何内容。
所以,
还有其他人看到过这个问题吗?
它会影响其他人的开发环境吗?
有人知道如何解决这个问题吗?
感谢@erik
我想给你点赞,但你的评论旁边似乎没有向上箭头。但非常感谢。
是的,服务器上 vbscript.dll 的版本不同。我已经在我的开发环境和我同事的机器上替换了那些 DLL,问题就消失了。我们正在监视日志以查看使用服务器 DLL 是否有任何不利影响,但到目前为止一切看起来都很好。
我必须先从 TrustedInstaller 获取 DLL 的所有权,然后才能替换它们,但之后一切顺利,不确定我是否必须这样做,但我在完成后将所有权归还给 TrustedInstaller。
服务器和我们的开发机器都已 windows 更新,所以我假设 DLL 差异是平台特定的,或者可能是 Windows 10 中他们想要解决但未放入版本中的内容他们在更新时推送到服务器。
详情。
system32\vbscript.dll
Windows 10 DLL 25/07/2018 17:31(版本 5.812.10240.16384)
Windows 服务器 2012R2 DLL 19/07/2018 05:33(版本 5.8.9600.19101)
syswow64\vbscript.dll
日期和版本都与 system32 相同(文件大小不同,但这是可以预料的)。