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


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

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

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


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

看来不单单查询这样,遍历过程中,任何涉及到所有行的操作,例如查找和计算都如此,我将第一列和第二列改为整数型,下面两段代码效率同样相差几百倍:

 

普通的:

Dim v As Double
For Each dr As DataRow In DataTables("表A").DataRows
    v = DataTables("表A").Compute("Sum(第二列 )", "第二列 = " & dr("第一列"))
    dr("第四列") = v
Next

 

高效的,快了300倍:

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("Sum(第二列 )", "第二列 = " & dr("第一列"))
    dic.Add(dr, v) 
Next
For Each dr As DataRow In dic.Keys
    dr("第四列") = dic(dr)
Next


 回到顶部
帅哥哟,离线,有人找我吗?
易服
  12楼 | 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多,手按秒表计时有点误差。


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


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

连续两天看到Dictionary的妙用,令人瞠目,不得不顶!!

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


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

以下是引用易服在2010-12-7 15:59:00的发言:

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

 

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


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


加好友 发短信
等级:三尾狐 帖子:734 积分:5645 威望:0 精华:0 注册:2008/9/6 11:22:00
  发帖心情 Post By:2010/12/7 16:13:00 [只看该作者]

以下是引用易服在2010-12-7 15:59:00的发言:

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

兄弟,不能用手按秒表计时,狐表里有时间的控件,用这个算会更准一点


 回到顶部
帅哥哟,离线,有人找我吗?
易服
  16楼 | 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" '降序排列
就是以上代码再无别的,经过反复测试对比效果一样


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


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

下面这个文件,可以配合一楼的代码测试,注意每次测试都重新打开项目,不用保存:

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目22.table

[此贴子已经被作者于2010-12-7 23:21:44编辑过]

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


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

搞不明白,16楼的代码的确不存在两种代码效率上大的差异。

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


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

我朋友这电脑太差了,没法测试。。。。  这个问题不是和我的一个帖子类似吗:

http://www.foxtable.com/dispbbs.asp?boardid=2&id=8511&authorid=0&page=0&star=1 

没看过的朋友可以对比一下··· 呵呵

 

 

[此贴子已经被作者于2010-12-7 21:59:45编辑过]

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


加好友 发短信
等级:五尾狐 帖子:1033 积分:7391 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2010/12/7 22:04:00 [只看该作者]

 Dictionary的用法我不熟啊!

 

我经常会用FOR EACH计算,但是我用FIND在其他表中找,一般不在本表中找,所以没碰到这样的速度慢的问题。

 

学习中


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