Foxtable(狐表)用户栏目专家坐堂 → 令人目瞪口呆的效率差别(有修正)


  共有42930人关注过本帖树形打印复制链接

主题:令人目瞪口呆的效率差别(有修正)

帅哥哟,离线,有人找我吗?
czy
  41楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/12/8 14:52:00 [只看该作者]

没有文件,我按他的代码自己做过测试文件,其它什么事件都没有

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  42楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/8 15:10:00 [只看该作者]

有一种可能,就是需要写入值的行非常少,这样影响几乎没有
 
例如对于这个文件,
 
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目21.table

 
这个代码只需1秒左右:
 
For Each dr As DataRow In DataTables("表A").DataRows
    If DataTables("表A").Find("第二列 = " & dr("第一列") ) Is Nothing Then
        dr("第三列") = True
    Else
        dr("第三列") = False
    End If
Next
 
如果反过来:
 
For Each dr As DataRow In DataTables("表A").DataRows
    If DataTables("表A").Find("第二列 = " & dr("第一列") ) Is Nothing Then
        dr("第三列") = False
    Else
        dr("第三列") = True
    End If
Next

就需要230多秒。

 回到顶部
帅哥哟,离线,有人找我吗?
czy
  43楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/12/8 15:32:00 [只看该作者]

收到,应该是这个原因了。

 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  44楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/8 19:53:00 [只看该作者]

我用他以前的文件测试,差距还是巨大的:


图片点击可在新窗口打开查看此主题相关图片如下:未命名00.jpg
图片点击可在新窗口打开查看

 

这个是测试文件: 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:代码更改.rar

[此贴子已经被作者于2010-12-8 19:54:02编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
czy
  45楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/12/8 20:36:00 [只看该作者]

你测试一下下面的代码,红色字体为效率不高的源头。

 

Dim s As Date = Date.Now()
Dim str As String
Dim Dic As New Dictionary(of DataRow, String)
For Each dr As DataRow In DataTables("申请表").DataRows
    str = "[乡名] = '" & dr("乡名") & "'And [村名] = '" & dr("村名") & "' And [组别] = '" & dr("组别") & "'"
    str = str  & " And [_Identify] < " & dr("_Identify")
    dic.Add(dr,Format(DataTables("申请表").Compute("Count(乡名)",str)+1,"00"))
Next
For Each dr As DataRow In dic.Keys
    dr("宗地序号") = dic(dr)
Next
Output.show((Date.Now -s).TotalSeconds)


 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  46楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/8 22:22:00 [只看该作者]

 

呵呵,真是这个“源头”···慢30倍啊      (刚才在做http://www.foxtable.com/dispbbs.asp?boardid=2&Id=8797

[此贴子已经被作者于2010-12-8 22:23:15编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  47楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/8 22:33:00 [只看该作者]

我也明白了,只有等于查询,才会有这种效率差别,其他没有。


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  48楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/8 22:55:00 [只看该作者]

易服的东西优化后,可以2秒左右,原因大家仔细体会一下:

 

Dim s As Date = Date.Now()
Dim dic As New Dictionary(of DataRow, String)
Dim drs  As List(of DataRow)
For Each dr As DataRow In DataTables("申请表").DataRows
    drs = DataTables("申请表").Select("[乡名] = '" & dr("乡名") & "'And [村名] = '" & dr("村名") & "' And [组别] = '" & dr("组别") & "'", "[_Identify] Desc")
    For i As Integer = 0 To drs.Count - 1
        If drs(i)("_Identify") < dr("_Identify") Then
              dic.Add(dr,drs.count - i)
              Exit For      
        Elseif i = drs.count -1 Then
            dic.add(dr,0)    
        End If
    Next
Next
For Each dr As DataRow In dic.Keys
    dr("宗地序号") = dic(dr)
Next
Output.show((Date.Now -s).TotalSeconds)

[此贴子已经被作者于2010-12-9 8:26:37编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  49楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/12/8 23:04:00 [只看该作者]

还是老大强, 不用每次都拿1万行来比较大小了,是这样吗?

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  50楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251048 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/12/8 23:05:00 [只看该作者]

呵呵,是因为你提供了测试数据,C版找出了原因,我才....

 

至于测试,并非一定要1万行的。


 回到顶部
总数 96 上一页 1 2 3 4 5 6 7 8 9 10 下一页