以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]高效率地判断末级节点 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=91416) |
||||
-- 作者:chnfo -- 发布时间:2016/10/10 14:48:00 -- [求助]高效率地判断末级节点 查询与赋值并存,这个帮助章节里提到遍历里嵌套find或select导致效率降低。 我的示例中,同样也是10000行数据,但两种方法测试直接遍历赋值用时104秒,两次遍历用时反而用时更长128秒。 这是什么原因?还能优化之吗?
|
||||
-- 作者:有点蓝 -- 发布时间:2016/10/10 15:08:00 -- 我测试两次遍历确实快。你的瓶颈在于like上面,这个效率非常低 |
||||
-- 作者:chnfo -- 发布时间:2016/10/10 15:11:00 -- 我又试了多次,但是两次遍历较之一次,虽然快,但非常有限,10000行数据只在10秒左右,不象示例中的相差300倍那么明显。 既然like存在瓶颈,那么有什么好点的方法不? 比如增加一个辅助列如FCode,比如这一行的Code = 1.2.3.4,那么FCode = 1.2.3,就可以用=来判断,效率应当会高很多。
[此贴子已经被作者于2016/10/10 15:54:55编辑过]
|
||||
-- 作者:jspta -- 发布时间:2016/10/10 15:58:00 -- 修改下思路,基本上达到秒改,但是保存到数据库还是比较慢,没办法。代码如下 Dim st As Date = Date.Now \'要测试耗时的代码 Dim dt As DataTable = DataTables("D") Dim lst As List(of DataRow) = dt.Select("","Code") Dim iMax As Integer = lst.Count -1 For IntA As Integer = 0 To iMax If IntA < IMax Then Dim dr1 As DataRow = lst(IntA) Dim dr2 As DataRow = lst(IntA+1) Dim str1 As String = dr1("Code") Dim str2 As String = dr2("Code") dr1("Tree") = not str2.StartsWith(str1) Else lst(IntA)("Tree") = True End If Next MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") |
||||
-- 作者:chnfo -- 发布时间:2016/10/10 17:18:00 -- 增加一个辅助列FCode,10000行数据,1秒内搞定。 find中用like效率很低,不知compute中或者deletefor这些中,使用like是否也是瓶颈? -----实际测试,deletefor中用like,10000行数据几乎是秒删。 看来遍历中用find,而且用like,要用一些其它的手段来搞。
[此贴子已经被作者于2016/10/10 21:17:45编辑过]
|
||||
-- 作者:chnfo -- 发布时间:2016/10/20 14:44:00 -- 查询与赋值并存 Dim lst1 As New
List(of
DataRow) 实际测试,这里的条件如果包括有and 或or之类的,总之是多条件的话,效率会几何级数地下降。 所以,如果要遍历和赋值并存,最好用辅助列将条件合并为一个,效率会很高。 实际测试, 70000万数据,如果用了一次and,用时138秒;而用辅助列合并条件为一个,用时5秒。 |