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


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

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

帅哥哟,离线,有人找我吗?
易服
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/7 13:41:00 [显示全部帖子]

有一按钮“编号”:自觉效率不高,能优化?

Dim str As String
For Each dr As DataRow In DataTables("申请表").DataRows
    str = "[乡名] = '" & dr("乡名") & "'And [村名] = '" & dr("村名") & "' And [组别] = '" & dr("组别") & "'"
    str = str  & "And  [单位(个人)] = '" & dr("单位(个人)") & "'  And  [法定代表人] = '" & dr("法定代表人") & "' And [_Identify] < " & dr("_Identify")
    dr("宗地序号") = Format(Tables("申请表").Compute("Count(乡名)",str)+1,"00")
Next
Tables("申请表").Sort = "法定代表人 DESC" '降序排列


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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/7 14:43:00 [显示全部帖子]

以下是引用狐狸爸爸在2010-12-7 14:35:00的发言:

 

可以这么改改看看:

 

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  [单位(个人)] = '" & dr("单位(个人)") & "'  And  [法定代表人] = '" & dr("法定代表人") & "' And [_Identify] < " & dr("_Identify")
    dic.Add(dr,Format(DataTables("申请表").Compute("Count(乡名)",str)+1,"00"))
Next
For dr As DataRow In dic.Keys
    dr("宗地序号") = dic(dr)
Next


图片点击可在新窗口打开查看此主题相关图片如下:2010-12-7 14-42-11.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/7 15:59:00 [显示全部帖子]

以下是引用狐狸爸爸在2010-12-7 15:02:00的发言:

这都看不出来吗,我手误而已, 应该是:

 

For Each dr As DataRow In dic.keys

 

两者几乎没什么差别,12740条记录用时原来代码1分48秒多,新代码1分46多,手按秒表计时有点误差。


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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/7 17:04:00 [显示全部帖子]

以下是引用狐狸爸爸在2010-12-7 16:13:00的发言:

 

有差别的,你改得不对而已。

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  [单位(个人)] = '" & dr("单位(个人)") & "'  And  [法定代表人] = '" & dr("法定代表人") & "' 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
Tables("申请表").Sort = "法定代表人 DESC" '降序排列
就是以上代码再无别的,经过反复测试对比效果一样


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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/8 9:46:00 [显示全部帖子]

以下是引用czy在2010-12-7 19:22:00的发言:
搞不明白,16楼的代码的确不存在两种代码效率上大的差异。

新代码

 
图片点击可在新窗口打开查看此主题相关图片如下:2010-12-8 9-34-37.png
图片点击可在新窗口打开查看
旧代码


图片点击可在新窗口打开查看此主题相关图片如下:2010-12-8 9-40-55.png
图片点击可在新窗口打开查看
差别不大,大约10秒

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

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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/13 10:49:00 [显示全部帖子]

以下是引用狐狸爸爸在2010-12-8 22:55:00的发言:

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

 


图片点击可在新窗口打开查看此主题相关图片如下:2010-12-13 9-45-29.png
图片点击可在新窗口打开查看
同样是12740行原代码120多秒,现只需25.734375秒,但不是我要结果。我要的结果是同一法定代表人的宗地排在一起按升序排列,一般法定代表人的宗地数最多不会超过50块。

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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/13 16:44:00 [显示全部帖子]


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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/14 9:22:00 [显示全部帖子]

8楼代码结果是正确的,12740行8楼代码120多秒,现只需25.734375秒,但结果不正确。宗地序号列最多不会大于50,而现在有2000多,排序只要加上 Tables("申请表").Sort = "法定代表人 DESC" '降序排列

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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/14 11:26:00 [显示全部帖子]

以下是引用狐狸爸爸在2010-12-14 9:35:00的发言:

 

你完全可以参照48楼的代码来改写8楼的代码。


图片点击可在新窗口打开查看此主题相关图片如下:2010-12-14 11-19-07.png
图片点击可在新窗口打开查看
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("组别")  & "'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
Tables("申请表").Sort = "法定代表人 DESC" '降序排列
Output.show((Date.Now -s).TotalSeconds)
只可惜从“0”开始,从“1”开始就完美了

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


加好友 发短信
等级:三尾狐 帖子:787 积分:6349 威望:0 精华:0 注册:2008/9/1 8:26:00
  发帖心情 Post By:2010/12/14 17:26:00 [显示全部帖子]

.........

dr("宗地序号") = Format(dic(dr)+1,"00")

.........


 回到顶部
总数 13 1 2 下一页