我们的任务是将旧版VB6应用程序转换为VB.Net。
代码转换已经完成了一段时间,我们正在测试中。
测试工具套件的一部分是能够重复运行系统负载测试。
我们观察到,使用VB.NET版本进行测试需要花费更长的时间。
作为分析的一部分,我们创建了一个测试,该测试仅对应用程序使用ADODB访问SQL数据库的部分进行负载测试。
这是性能问题所在。
尤其是问题在于通过键从相对较小的表(例如20左右列)中检索单行。
每个表的一行中的每个条目都有一个唯一的int键和一个唯一的varchar键。
在两个版本中,检索都是通过SQL Server存储过程进行的。键值作为ADODB.Parameter附加到ADODB.Command的形式传递。实际上,两个版本都使用相同的数据库实例(使用相同的存储过程)。在每次测试之前,我们将删除表中所有先前存在的行。
两个版本中数据库的连接字符串为:
Driver = {SQL Server};服务器= MYCOMPUTER \ SQLEXPRESS;数据库= THEDATABASENAME
用于检索的存储过程为:
SELECT * From Table1 WHERE TheKey = @ptheKey
其中@ptheKey是ADODB.Parameter的值。
要获得以下结果,我们首先为每个表加载5000行。尽管VB.Net的插入速度稍快,但插入所需的时间大致相同。
行的加载顺序为5000到1(即向后)。
然后我们运行检索测试:
1]从表1中,以1到5000的顺序检索10000行;
2]从表1中,以随机顺序检索10000行;
3]从表1中,以随机顺序检索(或要求检索)10000个不存在的行。
在上面,前5000次检索使用int键,后5000次检索使用varchar键。
对于表2重复测试。
检索每行后,我们检查数据以确保已检索(或未检索到)正确的行。
以下是典型的检索时间结果(所有时间以毫秒为单位):
VB6表1测试1:3926
VB6表1测试2:2740
VB6表1测试3:4444
VB6表2测试1:3882
VB6表2测试2:2596
VB6表2测试3:4635
.NET表1测试1:241715
.NET表1测试2:212798
.NET表1测试3:238280
.NET表2测试1:122237
.NET表2测试2:75840
.NET表2测试3:244343
.NET检索花费30至75倍的时间。时间可以在100毫秒左右的时间内通过多个测试完全重现。
以下是执行单行检索的VB6代码(如果是测试类型3,则失败)。
Dim RecordSet As ADODB.RecordSet
Set RecordSet = sqladodbcommand.Execute
其中sqladodbcommand是ADODB.Command对象,附加的ADODB.Parameter设置为键值。
以下是用于执行单行检索的.NET代码(如果是测试类型3,则失败)。
Dim RecordSet As ADODB.RecordSet
RecordSet = New ADODB.Recordset
RecordSet.Open(sqladodbcommand,ADODB.LockTypeEnum.adLockOptimistic)
预期的问题:
1]所有与SQL相关的代码都驻留在一个模块中;
2]在负载测试期间没有其他代码正在运行;
3]只有一个数据库连接处于活动状态,即负载测试连接;
4]从返回的Recordset检索Recordset值已被剥离,以验证从返回的Recordset对象中提取数据不会影响时间;
5] VB6对ADO的引用是“ microsoft activeX数据对象6.0 BackCompat库”;
6] .NET对ADO的引用是“ microsoft activeX数据对象2.8库”。
任何见解或建议都会得到感谢。
更新(几天后): 将源代码从ADODB转换为ADO.NET之后,插入所需的时间与VB6和ADODB大致相同。
但是,在检索方面,检索速度(至少)是VB6的两倍,并且比ADODB快一百倍。
(对于可能在搜索过程中阅读本书的任何新手,请查看System.Data.SqlClient中的接口。)
我们将运行更多测试以比较单条记录更新的结果。