以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  GetValues  (http://foxtable.com/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没有关系了吧

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


--  作者: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秒。