遇到个纠结的问题,行数多了(六七百行)速度很慢,按理说与行数没关系的

BZisSunZi 2011-06-16 10:47:49
根据身份证号自动计算生日和性别的功能,dw的 itemchanged事件,
行数多了(六七百条)速度很慢,要六七秒的时间,多一百条数据就多一秒钟,如果是指几十行数据就感觉不出来。按理说与数据条数是没关系的,以下是源码, 大家帮忙看看,也不是很高深的问题:

case "身份证号"
//this.acceptText ()
setPointer(HourGlass!)
string ls_data
string ls_xb //性别
datetime ldt_bir //生日
ls_data = trim(data)
if len(trim(ls_data)) <> 18 and len(trim(ls_data)) <> 15 then
messageBox ('提示', '身份证号必须为18位或15位', stopSign!)
return
end if
//wf_cal_idcar (row ,data) //自动计算生日,性别

choose case len(ls_data)
case 18
ls_temp = mid(ls_data, 7, 4) + '-' + mid(ls_data, 11, 2) + '-' + mid(ls_data, 13, 2)
ldt_bir = datetime (date(ls_temp))
if mod(long(mid(ls_data, 17, 1)),2) =1 then
ls_xb = '男'
else
ls_xb = '女'
end if
case 15
ls_temp = mid(ls_data, 7, 2) + '-' + mid(ls_data, 9, 2) + '-' + mid(ls_data, 11, 2)
ldt_bir = datetime (date(ls_temp))
//messageBox (ls_temp, string(ldt_bir) )
end choose
setItem (row, '出生日期', ldt_bir)
setITem(row, '性别', ls_xb)
...全文
130 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wag_enu 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 # 楼 lzp_lrp 的回复:]
已经解决的帖子如果有人再回复,就会跑到待解决的帖子里
[/Quote]

试一下,跑不跑到待解决。。。
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bzissunzi 的回复:]
引用 16 楼 yyoinge 的回复:
应该是计算列的问题

郁闷了, 我把代码复制到另一个软件里运行,几千条数据,cpu间隔时间为零,很正常

dw中也没有计算列
[/Quote]

其实这样看来问题基本解决了,你只要对比这两边程序的代码,数据窗口的syntax语法等内容,总是能找到原因的
WorldMobile 2011-06-16
  • 打赏
  • 举报
回复
应该还是执行了其它的代码,把数据窗口删除掉,重新加一个,除了itemchanged事件不要写任何代码,再试


如果还不行,把dataobject重新画一下,不要任何计算列,再试一下


-------------------------------------

如果和setItem (row, '出生日期', ldt_bir)有关的话,应该是窗口里引用了个计算列,如显示年龄之类的,你仔细找找
xuam 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bzissunzi 的回复:]
引用 14 楼 yyoinge 的回复:
dw中有没有什么计算列运算量比较大的


只有年龄是根据日期自动计算,不过这是在后台sql中计算的,这时没有保存数据,所以也不会有影响
[/Quote]

后台sql中计算也有影响
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yyoinge 的回复:]
dw中有没有什么计算列运算量比较大的
[/Quote]

只有年龄是根据日期自动计算,不过这是在后台sql中计算的,这时没有保存数据,所以也不会有影响
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yyoinge 的回复:]
应该是计算列的问题
[/Quote]
郁闷了, 我把代码复制到另一个软件里运行,几千条数据,cpu间隔时间为零,很正常

dw中也没有计算列
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
应该是计算列的问题
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yyoinge 的回复:]
这个确实不会影响,影响的肯定是其他的,你试着把这段代码写成
case "身份证号"
string ls
ls = ''

看看,速度如何
[/Quote]

试了, 一样的速度~~~(在判断位数之后加ls_data='')
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
dw中有没有什么计算列运算量比较大的
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yyoinge 的回复:]
那你跟踪一下执行哪句代码时比较慢
[/Quote]

似乎在这两句卡了一下:
setItem (row, '出生日期', ldt_bir)
setITem(row, '性别', ls_xb)
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yyoinge 的回复:]
那你跟踪一下执行哪句代码时比较慢
[/Quote]

断点跟踪,看执行到哪条语句时,占用时间长
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yyoinge 的回复:]
你最好设置断点调试一下,这样更容易找出慢在哪里
按你这种说法,肯定有哪个地方的代码需要遍历到所有行
[/Quote]

从第一句setPointer(HourGlass!)设置的跟踪点, 然后单步跟踪的
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lzp_lrp 的回复:]
你把我在3楼写的代码执行一下,看一下运行的时间
[/Quote]
700条数据 3500毫秒,100条数据,450毫秒
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
那你跟踪一下执行哪句代码时比较慢
WorldMobile 2011-06-16
  • 打赏
  • 举报
回复
你把我在3楼写的代码执行一下,看一下运行的时间
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
你最好设置断点调试一下,这样更容易找出慢在哪里
按你这种说法,肯定有哪个地方的代码需要遍历到所有行
xuam 2011-06-16
  • 打赏
  • 举报
回复
应该不是这段代码造成速度慢!
BZisSunZi 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lzp_lrp 的回复:]
问题不是出在这儿,把你的QQ贴上来,帮你远程看一下,应该是rowfocuschanged之类的地方重复调用了一些代码
[/Quote]

我单步跟踪过无数次了, 没有执行其他的代码的
yyoinge 2011-06-16
  • 打赏
  • 举报
回复
这个确实不会影响,影响的肯定是其他的,你试着把这段代码写成
case "身份证号"
string ls
ls = ''

看看,速度如何
WorldMobile 2011-06-16
  • 打赏
  • 举报
回复
case "身份证号"
//在这个位置记录一下cpu
long ll_cpu
ll_cpu = cpu()
//this.acceptText ()
setPointer(HourGlass!)
string ls_data
string ls_xb //性别
datetime ldt_bir //生日
ls_data = trim(data)
if len(trim(ls_data)) <> 18 and len(trim(ls_data)) <> 15 then
messageBox ('提示', '身份证号必须为18位或15位', stopSign!)
return
end if
//wf_cal_idcar (row ,data) //自动计算生日,性别

choose case len(ls_data)
case 18
ls_temp = mid(ls_data, 7, 4) + '-' + mid(ls_data, 11, 2) + '-' + mid(ls_data, 13, 2)
ldt_bir = datetime (date(ls_temp))
if mod(long(mid(ls_data, 17, 1)),2) =1 then
ls_xb = '男'
else
ls_xb = '女'
end if
case 15
ls_temp = mid(ls_data, 7, 2) + '-' + mid(ls_data, 9, 2) + '-' + mid(ls_data, 11, 2)
ldt_bir = datetime (date(ls_temp))
//messageBox (ls_temp, string(ldt_bir) )
end choose
setItem (row, '出生日期', ldt_bir)
setITem(row, '性别', ls_xb)

//在这个位置看一下执行的时间(毫秒)
messagebox('', cpu() - ll_cpu)
加载更多回复(2)

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧