Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
我看到说明文件中以下的说明,请问我上面的情况与说明中所说的条件一样吗?说明中说到(符合以下三个条件,会出现效率低下的情况),但我的情况好像不是同一表中的
出人意料的是,两段代码运行得都非常快,都在瞬间完成了。
那为什么第一段代码需要花费234秒?难道查询和赋值不能出现在同一个遍历语句中吗?
为此我改写了第一段代码,让查询和赋值分开进行,新的代码为:
Dim lst1 As New
List(of
DataRow)
Dim lst2 AS New
List(of
DataRow)
For Each dr As DataRow In DataTables("表A").DataRows
If
DataTables("表A").Find("第二列 = "
&
dr("第一列")) Is Nothing Then
lst1.Add(dr)
Else
lst2.Add(dr)
End If
Next
For Each dr As DataRow In lst1
dr("第三列") = True
Next
For Each dr As DataRow In lst2
dr("第三列") = False
Next
同样在数据为1万行,第三列无数据的时候,执行上述代码只花了0.8秒,比原来的234秒快了整整300倍,效率差距之大,令人瞠目。
原因应该找到了,为了验证我的想法,我打算对Compute方法进行测试,因为Compute在计算过程同样要进行查询。
于是我另外写了两段代码,这次不使用Find进行查询,而是使用Compute方法进行计算:
常规的代码,计算和赋值在同一个遍历语句:
Dim v As Double
For Each dr As DataRow In DataTables("表A").DataRows
v =
DataTables("表A").Compute("Count(第二列 )", "第二列 = "
&
dr("第一列"))
dr("第四列") = v
Next
估计效率更高的代码,计算和赋值分开进行:
Dim Dic As new
Dictionary(of
DataRow, Integer)
Dim v As Double
For Each dr As DataRow In DataTables("表A").DataRows
v = DataTables("表A").Compute("Count(第二列
)", "第二列 =
"
&
dr("第一列"))
dic.Add(dr, v)
Next
For Each
dr As
DataRow In
dic.Keys
dr("第四列") = dic(dr)
Next
果不其然,经过测试,第二段比第一段同样快了整整300倍。
现在我总结一下,符合以下三个条件,会出现效率低下的情况:
1、用For语句遍历某个表。
2、遍历过程中会用Find或Select查询此表,或者用Compute方法统计此表。
3、遍历过程中会大量修改此表中某些行的值,被修改的行数越多,对于性能影响越大,如果被修改的行数很少,则几乎没有影响。
强调一下,上述三项中提到的表必须都是同一个表。
我们改写的代码之所以高效,是因为改写后的代码使得上述2、3项不再出现在同一个遍历语句中,而是在不同的遍历语句中出现。