欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

关于vfp代码运行速度有关问题

更新时间: 2014-01-05 02:27:42 责任编辑: Author_N1

 

关于VFP代码运行速度问题
有段查询代码,100条记录运行时间为0.047秒,而1000条记录运行时间为4.238秒,每条记录有7个字段需要统计,运行时间为什么相差这么大,问题出在第二个SCAN ENDSCAN语句中,可能与OCCURS()有关。
而生成10000条记录的临时表的运行时间才0.125秒。
请大家帮忙看看
CREATE CURSOR T (XM C(5),SX N(2),YW N(2),YY N(2),WL N(2),HX N(2),DN N(2),ZZ N(2))
=RAND(-1)
FOR I=1 TO 1000
    INSERT INTO T (XM) VALUES (PADL(I,5,[0]))
    FOR J=2 TO FCOUNT()
        N=RAND()*60
        REPLACE (FIELD(J)) WITH N+J
    ENDFOR
ENDFOR
T1=SECONDS()
SELECT *,PADL(SX,2,[0])+[,]+PADL(YW,2,[0])+[,]+PADL(YY,2,[0])+[,]+PADL(WL,2,[0])+[,]+PADL(HX,2,[0])+[,]+PADL(DN,2,[0])+[,]+;
PADL(ZZ,2,[0]) NR,0000 TJ,0000 A1,0000 A2,0000 A3,0000 A4,0000 A5,0000 A6,0000 A7 FROM T INTO CURSOR T1 READWRITE
* 说明:A1-A7对应于每门课程成绩出现的次数

LOCAL CSTR
CSTR=[]
SCAN
   CSTR=CSTR+ALLTRIM(NR)+IIF(RECNO()<RECCOUNT([T1]),CHR(13)+CHR(10),[])
ENDSCAN
SCAN
   CSTR1=STRTRAN(CSTR,NR,[]) && 不含当前记录
   SCATTER FIELDS SX,YW,YY,WL,HX,DN,ZZ TO AZD
   LOCAL S[7]
   FOR I=1 TO 7
       S[I]=OCCURS(PADL(AZD(I),2,[0]),CSTR1)
       REPLACE TJ WITH TJ+S[I],(FIELD(I+10)) WITH S(I)
   ENDFOR
ENDSCAN
MESSAGEBOX([运行时间:]+TRANSFORM(SECONDS()-T1)+[ 秒])
SELECT T1
BROWSE


--参考方法--
下面是使用 vfp9 自带的 Coverage Profiler 工具统计的结果

从中可以看到
S[I]=OCCURS(PADL(AZD(I),2,[0]),CSTR1)
被运行了 7000 次,一共用了 7000*0.000814=5.7 秒,这是在我的笔记本上的运行结果,总时间是 6.44 秒,这条语句占了近 90% 时间
--参考方法--
*--1秒以内:
Create Cursor ta (fa N(2))
Create Cursor T (XM C(5),SX N(2),YW N(2),YY N(2),WL N(2),HX N(2),DN N(2),ZZ N(2))
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:27:42
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/10092/
本文WWW.DOC100.NET DOC100.NET版权所有。