以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 增加多行耗时长的问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=193391) |
-- 作者:hfapplehao -- 发布时间:2024/9/10 8:30:00 -- 增加多行耗时长的问题 老师您好,写了个增加多行的程序,但是运行速度不敢恭维,代码如下: Dim strt As Integer Dim st As Date = Date.Now \'将开始时间保存在变量st中 InputValue(strt, "增加行", "突破增加300行限制") currenttable.StopRedraw() CurrentTable.addnew(strt) CurrentTable.ResumeRedraw() MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") 初步测算了下,增加2000行耗时52.6秒,这个速度还是很慢啊,怎样优化一下,让速度更快?
|
-- 作者:cd_tdh -- 发布时间:2024/9/10 8:51:00 -- 不应该啊,我测试3000行不到1秒的速度,怎么会慢,是有其他代码影响了 10000行,0.22秒
[此贴子已经被作者于2024/9/10 8:53:01编辑过]
|
-- 作者:有点蓝 -- 发布时间:2024/9/10 8:58:00 -- 我测试5000行才0.16秒。应该从输入后开始计时呀,不然等1个小时后再输入行数,那不更久,这不合理的 Dim strt As Integer InputValue(strt, "增加行", "突破增加300行限制") Dim st As Date = Date.Now \'将开始时间保存在变量st中 currenttable.StopRedraw() CurrentTable.addnew(strt) CurrentTable.ResumeRedraw() MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") |
-- 作者:hfapplehao -- 发布时间:2024/9/10 11:08:00 -- 第二次测试仍然有46秒,这是哪里除了问题吗?电脑配置是Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz 2.90 GHz,内存16G的速度应该可以的
|
-- 作者:hfapplehao -- 发布时间:2024/9/10 14:10:00 -- 跟数据库有关系吗?我用的是sql 2012数据库 |
-- 作者:cd_tdh -- 发布时间:2024/9/10 14:25:00 -- 和数据库没关系吧,我用的还是2008,在说currenttable都是当前表,没有保存数据,不可能那么长时间,你排查一下看看有没其他代码影响了速度。 |
-- 作者:有点蓝 -- 发布时间:2024/9/10 14:26:00 -- 那就是这个表格有表达式列,或者是事件代码影响了 |
-- 作者:hfapplehao -- 发布时间:2024/9/10 14:45:00 -- 排查了下,我在datarowadded 事件中 增加了这个代码,因为这个代码的影响吗? If e.DataTable.Name.Contains("原始报价") and e.DataTable.DataCols.Contains("船名") Then e.DataRow("船名") = "新" End If 有什么好方法改进吗?
|
-- 作者:有点蓝 -- 发布时间:2024/9/10 15:54:00 -- 把这个表所有代码备份,然后去掉测试就知道是不是这些个代码影响的了。 试试屏蔽事件 Dim strt As Integer InputValue(strt, "增加行", "突破增加300行限制") Dim st As Date = Date.Now \'将开始时间保存在变量st中 currenttable.StopRedraw() SystemReady = False dim max as integer = CurrentTable.compute("max(_identify)") CurrentTable.addnew(strt) if CurrentTable.Cols.Contains("船名") then CurrentTable.datatable.replacefor("船名","新","_identify >" & max ) end if SystemReady = true CurrentTable.ResumeRedraw() MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") |
-- 作者:hfapplehao -- 发布时间:2024/9/10 17:00:00 -- 问题完美解决啊。复制这段代码运行起来 0.2s 就完成了 Dim strt As Integer InputValue(strt, "增加行", "突破增加300行限制") Dim st As Date = Date.Now \'将开始时间保存在变量st中 currenttable.StopRedraw() SystemReady = False Dim max As Integer = CurrentTable.compute("max(_identify)") CurrentTable.addnew(strt) If CurrentTable.Cols.Contains("船名") Then CurrentTable.DataTable.replacefor("船名", "新", "_identify >" & max) End If SystemReady = True CurrentTable.ResumeRedraw() MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") 另外还有个小问题。我这边还有个表达式影响的列,存在一个序号列,本意是新增加一个行就给出一个编号,编号增量为1 如果要保持这种功能的话,我这个代码应该怎么修改一下呢? |