标题:如何提高程序运行速度
取消只看楼主
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
结帖率:76.81%
已结贴  问题点数:20 回复次数:29 
如何提高程序运行速度
我总习惯用FOR-ENDFOR编写统计代码,在几十个字段、不到1000行的代码中,对1000左右记录统计要运行20-30分钟,对3万条记录统计要运行几个小时(至少3个小时)。不知有何好的建议改进,谢谢!
搜索更多相关主题的帖子: 记录 统计 运行 速度 小时 
2020-09-12 19:40
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
例如下表
b2.rar (456 Bytes)

对_1d,_1x,_1t上下记录统计,上下记录相同字段连续,则_1dxx, 否则_1dxxf

FOR i=2 TO RECCOUNT()
GO i
SKIP -1
k_1d=_1d
k_1x=_1x
k_1t=_1t
GO i
REPLACE _1dxx WITH '_1DXX' FOR '_'$k_1d AND '_'$_1d AND RECNO()=i
REPLACE _1dxx WITH '_1DXX' FOR '_'$k_1x AND '_'$_1x AND RECNO()=i
REPLACE _1dxx WITH '_1DXX' FOR '_'$k_1t AND '_'$_1t AND RECNO()=i
FOR NOT '_'$_1dxx AND ('_'$k_1d OR '_'$k_1x OR '_'$k_1t) AND RECNO()=i
ENDFOR
代码应怎样写才能提高运行速度?
最后一行代码有改动

[此贴子已经被作者于2020-9-12 21:17编辑过]

2020-09-12 20:57
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
回复 4楼 吹水佬
老师,是这样,谢谢!
    十多年前学了点VFP6.0,对SQL、数组等都未接触过,统计程序很原始,且丢了近十年,现因统计需要,又开始接触它。
    自在此论坛以来,在老师们的帮助指导下,学到了许多知识,基本全新的,方法、知识、思维方式都是全新的,受益非浅。为了优化我的传统代码,特别是运行速度,能让几万条记录在较短的时间统计出结果,我在此陆续将需要解决的主要问题发上来,请老师们指点帮助,希望能一直关注此帖后续,谢谢!
2020-09-13 12:07
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-13 09:40:01的发言:

从提供的数据看,优化表结构可以提高效率。
如:

**转换结构格式
SELECT jnh, .F. _1dxx, ICASE(!EMPTY(_1d),1,!EMPTY(_1x),2,!EMPTY(_1t),3,0) _1dxt;
    FROM b2 INTO CURSOR t1 READWRITE
SELECT _1dxt FROM t1 INTO CURSOR t2
SELECT t2
SET RELATION TO RECNO()+1 INTO "t1"
REPLACE ALL t1._1dxx  WITH t2._1dxt>0 AND t1._1dxt==t2._1dxt
SELECT jnh,;
       IIF(_1dxx,"_1DXX",IIF(_1dxt>0,"_1DXXF","      ")) _1dxx,;
       ICASE(_1dxt==1,"_1D",_1dxt==2,"_1X",_1dxt==3,"_1T","   ") _1dxt FROM t1
** 原结构格式显示
SELECT jnh,;
       IIF(!_1dxx AND _1dxt>0,"_1DXXF","      ") _1dxxf,;
       IIF(_1dxx,"_1DXX","     ") _1dxx,;
       IIF(_1dxt==1,"_1D","   ") _1d,;
       IIF(_1dxt==2,"_1X","   ") _1x,;
       IIF(_1dxt==3,"_1T","   ") _1t FROM t1
RETURN

有劳了,我在原始表中运行一下!
2020-09-13 12:27
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
回复 6楼 sdta
老师:
SELECT t2
SET RELATION TO RECNO()+1 INTO "t1"
上面语句是t2的上1行与t1的当前行关联?
REPLACE ALL t1._1dxx  WITH t2._1dxt>0 AND t1._1dxt==t2._1dxt
t2的上1行与t1的当前行的_1dxt相等时,为.T.?
2020-09-13 15:03
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
回复 5楼 吹水佬
老师:
SELECT t2
SET RELATION TO RECNO()+1 INTO "t1"
上面语句是t2的上1行与t1的当前行关联?
REPLACE ALL t1._1dxx  WITH t2._1dxt>0 AND t1._1dxt==t2._1dxt
t2的上1行与t1的当前行的_1dxt相等时,为.T.?
2020-09-13 15:05
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用sdta在2020-9-13 10:59:30的发言:


例如能解决问题吗

最后一行代码应是:
 
REPLACE _1dxxf WITH '_1DXXF' FOR NOT '_'$_1dxx AND ('_'$k_1d OR '_'$k_1x OR '_'$k_1t) AND RECNO()=i
2020-09-13 15:07
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-13 16:24:29的发言:

用 SELECT SQL 语句,测试一下:
SELECT a.jnh, (b._1dxt>0 AND a._1dxt==b._1dxt) _1dxx, a._1dxt;
    FROM t1 a, t1 b;
    WHERE a.jnh==(b.jnh+1)


REPLACE ALL t1._1dxx  WITH t2._1dxt>0 AND t1._1dxt==t2._1dxt
  
SELECT jnh,;
       IIF(_1dxx,"_1DXX",IIF(_1dxt>0,"_1DXXF","      ")) _1dxx,;
       ICASE(_1dxt==1,"_1D",_1dxt==2,"_1X",_1dxt==3,"_1T","   ") _1dxt FROM t1
结果一样,代码更简捷!

[此贴子已经被作者于2020-9-13 18:55编辑过]

2020-09-13 18:14
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以上方法代码简捷,运行效率高,我还得一一来学。
按4楼的方法:
表:
b1.rar (744 Bytes)

程序代码:
CLOSE TABLES all

USE b1 IN 0 ALIAS t1
BLANK FIELDS _1d, _1x,_1t,_2d, _2x,_2t ALL 
USE b1 IN 0 ALIAS t2 AGAIN 

SELECT t1

SET RELATION TO RECNO()+1 INTO "t2"


REPLACE ALL t2._1d  WITH IIF(t2.a1>t1.a1 ,"_1D", "");
            t2._1x  WITH IIF(t2.a1<t1.a1 ,"_1X", "");
            t2._1t  WITH IIF(t2.a1=t1.a1 ,"_1t", "");
            t2._2d  WITH IIF(t2.a2>t1.a2 ,"_2D", "");
            t2._2x  WITH IIF(t2.a2<t1.a2 ,"_2X", "");
            t2._2t  WITH IIF(t2.a2=t1.a2 ,"_2t", "")
           
SET RELATION TO
SELECT * FROM t1
BROWSE

没有问题,且运行比以前快多了
注:
"_1D"-下1行比上1行对应值大
"_1X"-下1行比上1行对应值小
"_1T"-下1行比上1行对应值相同



下面用变量就出问题
程序代码:
CLOSE TABLES all
USE b1 IN 0 ALIAS t1
BLANK FIELDS _1d, _1x,_1t,_2d, _2x,_2t ALL 
USE b1 IN 0 ALIAS t2 AGAIN 

SELECT t1

SET RELATION TO RECNO()+1 INTO "t2"

p1=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('1')
p11=&p1
k1=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('1')
k11=&k1
p2=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('2')
p22=&p2
k2=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('2')
k22=&k2
REPLACE ALL t2._1d  WITH IIF(k11>p11 ,"_1D", "");
            t2._1x  WITH IIF(k11<p11 ,"_1X", "");
            t2._1t  WITH IIF(k11=p11 ,"_1t", "");
            t2._2d  WITH IIF(k22>p22 ,"_2D", "");
            t2._2x  WITH IIF(k22<p22 ,"_2X", "");
            t2._2t  WITH IIF(k22=p22 ,"_2t", "")
           
SET RELATION TO
SELECT * FROM t1
BROWSE

问题在哪?

[此贴子已经被作者于2020-9-13 18:45编辑过]

2020-09-13 18:26
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-13 19:57:05的发言:

k11、p11等变量只获取了一条记录的数据
REPLACE ALL 是处理所有记录数据

因数据结构需要,要多次用到列变量,应如何处理?再嵌套循环吗?
2020-09-13 20:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-503137-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019041 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved