以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 请求指点代码低效的原因 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=41677) |
||||
-- 作者:东坡一剑 -- 发布时间:2013/10/24 21:09:00 -- 请求指点代码低效的原因 为了根据货品出库计划中每种货品的需求数量在库存中找到每钟货品的最佳的取货位置,生成取货明细以便照单取货,我编写了如下代码。 蓝字部分是插入测试效率的代码; 红字和绿字部分分别是利用集合和利用字典来保存用于生成取货单新增行的代码,算是两种方案吧; 运行得结果是:不管采用哪种方案,在两三百行数据的情况下,前三段代码都在几乎不足0.1秒的时间内运行完毕,效率应该是可以接受的。但是第四段代码足足用了160秒之多,效率实在太低。把帮助文件相关的章节又看了一遍,仍然搞不懂问题所在。请高手赐教!
If Tables("货品出库计划").Rows.Count = 0 Then
Dim r As Row
dr = DataTables("出库计划记录").Find("单号 =\'" & e.Form.Controls("单号").text & "\'")
sppp = Date.now - ttt
Dim cmd As New SQLCommand cmd.C cmd.CommandText = "Select * From {库存表} Where 库房 =\'" & User.Group & "库房\'" \'And 产品条码 = \'" & key & "\'" Dim dt As DataTable
sppp = Date.now - ttt
DataTables("取货明细").Save() |
||||
-- 作者:有点甜 -- 发布时间:2013/10/24 21:15:00 -- 耗时是在addnew上。你直接 addnew(lst.count),然后再分别写入数据。 这样会快很多。
|
||||
-- 作者:y2287958 -- 发布时间:2013/10/24 23:33:00 -- 楼上好经验 学习
|
||||
-- 作者:东坡一剑 -- 发布时间:2013/10/25 0:10:00 -- 我试了,现在耗时124秒,好像还是不够高效。 |
||||
-- 作者:y2287958 -- 发布时间:2013/10/25 8:32:00 -- 你就第四段代码做个例子传上来 大家看看 俺测试是效率明显提升的
[此贴子已经被作者于2013-10-25 8:33:05编辑过]
|
||||
-- 作者:东坡一剑 -- 发布时间:2013/10/25 10:25:00 --
例子传上,请诸位大神费心! 在”货品出库计划“窗口点“确定提交”即可测试 打开项目时需要手动连接数据库,数据库一并压缩到包里了。 [此贴子已经被作者于2013-10-25 10:26:33编辑过]
|
||||
-- 作者:Bin -- 发布时间:2013/10/25 11:11:00 -- 循环行赋值效率不高,这个没什么好办法. 可以的话换个方式处理这个问题吧. |
||||
-- 作者:东坡一剑 -- 发布时间:2013/10/25 11:51:00 -- 能不能建议一下,像我这种需求,还有什么可行的处理方式吗? |
||||
-- 作者:lihe60 -- 发布时间:2013/10/25 12:01:00 -- 没有明白楼主的意图,但有点可以确定:库存表、出库明细、取货明细这三张表是多余的。 |
||||
-- 作者:东坡一剑 -- 发布时间:2013/10/25 13:24:00 -- 根据货品出库计划中每种货品的需求数量,在库存表中找到每种货品的最佳的取货位置及本位置的取货数量,生成取货明细以便照单取货 这三张表是必须的,而不是多余的。 不管用什么方法能达到这个目的,同时代码的运行要高效!
现在的代码,目的达到了,但只要数据量稍微偏大,效率就极低。
|