以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- GetValues (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=170186) |
-- 作者:hbhb -- 发布时间:2021/7/15 13:51:00 -- GetValues 大师:劳驾测试GetValues的效率,回到解放前了,慢的像乌龟爬! 1万行的遍列获得,要几佰秒,用select只要0.5秒!
|
-- 作者:hbhb -- 发布时间:2021/7/15 14:12:00 -- 这能叫升级,能叫修复?举世没有,哪有这种道理,项目都要修改。 |
-- 作者:有点蓝 -- 发布时间:2021/7/15 14:15:00 -- select不需要去重,肯定是比GetValues快的。但是我测试返回10000行也只需要44毫秒。至于取数后的遍历就和GetValues没有关系了吧 |
-- 作者:hbhb -- 发布时间:2021/7/15 14:36:00 -- 如果以下代码改为GetValues方法,2万行测试要297秒,下面的代码只要0.6秒。 Dim st As Date = Date.Now Dim Dic As new Dictionary(of DataRow,String) For Each dr As DataRow In DataTables("dtpzzb").DataRows Dim jh As new List(of DataRow) Dim jh1 As new List(of String) If dr("pzzb9") <> 0 Then jh = DataTables("dtpzzb").Select(" pzzb8 <> 0 and pzzb142 = \'" & dr("pzzb142") & "\'") For Each tr As DataRow In jh If jh1.Contains(tr("pzzb12")) = False Then jh1.Add(tr("pzzb12")) End If Next Dim sz() As String sz = jh1.ToArray Dim zfc As String zfc = String.Join(";",sz) dic.Add(dr,zfc) ElseIf dr("pzzb8") <> 0 Then jh = DataTables("dtpzzb").Select(" pzzb9 <> 0 and pzzb142 = \'" & dr("pzzb142") & "\'") For Each tr As DataRow In jh If jh1.Contains(tr("pzzb12")) = False Then jh1.Add(tr("pzzb12")) End If Next Dim sz() As String sz = jh1.ToArray Dim zfc As String zfc = String.Join(";",sz) dic.Add(dr,zfc)
End If
Next MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") |
-- 作者:有点蓝 -- 发布时间:2021/7/15 14:40:00 -- 贴出改之后的代码 |
-- 作者:hbhb -- 发布时间:2021/7/15 14:48:00 -- Dim st As Date = Date.Now Dim Dic As new Dictionary(of DataRow,String) For Each dr As DataRow In DataTables("dtpzzb").DataRows
Dim jh1 As new List(of String) If dr("pzzb9") <> 0 Then jh1 = DataTables("dtpzzb").GetValues("pzzb12"," pzzb8 <> 0 and pzzb142 = \'" & dr("pzzb142") & "\'") Dim sz() As String sz = jh1.ToArray Dim zfc As String zfc = String.Join(";",sz) dic.Add(dr,zfc) ElseIf dr("pzzb8") <> 0 Then jh1 = DataTables("dtpzzb").GetValues("pzzb12"," pzzb9 <> 0 and pzzb142 = \'" & dr("pzzb142") & "\'") Dim sz() As String sz = jh1.ToArray Dim zfc As String zfc = String.Join(";",sz) dic.Add(dr,zfc)
End If
Next MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") |
-- 作者:hbhb -- 发布时间:2021/7/15 15:09:00 -- 测试无数遍了,真没意思,所有的代码都要更改!老版测试没有问题,充分证明,每次升级根本没有进行有效的测试! 另外友情提醒: 项目代码测试数据,最好要用中等数据20000条记录以上,否则好玩了。搞死你没商量!
|
-- 作者:有点蓝 -- 发布时间:2021/7/15 15:22:00 -- 请上传实例说明。 我测试刚好相反,使用select花费的时间是GetValues的3倍
|
-- 作者:y2287958 -- 发布时间:2021/7/15 15:49:00 -- 重出江湖了,江湖又开始沸腾了 |
-- 作者:hbhb -- 发布时间:2021/7/15 15:51:00 -- 不可能,多少行数据测试的?刚测试用了320秒。 |