标题:如何提高程序运行速度
只看楼主
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
结帖率:76.81%
已结贴  问题点数:20 回复次数:61 
如何提高程序运行速度
我总习惯用FOR-ENDFOR编写统计代码,在几十个字段、不到1000行的代码中,对1000左右记录统计要运行20-30分钟,对3万条记录统计要运行几个小时(至少3个小时)。不知有何好的建议改进,谢谢!
搜索更多相关主题的帖子: 记录 统计 运行 速度 小时 
2020-09-12 19:40
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:5 
如果可能的话,多用数组。在内存中处理不耗用I/O,应该会快很多。
由于没有看到你的数据和意图,只能这么给你建议。
2020-09-12 20:01
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
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
是不是这样:

程序代码:
USE b2 IN 0 ALIAS t1
USE b2 IN 0 ALIAS t2 AGAIN 
SELECT t1
SET RELATION TO RECNO()+1 INTO "t2"
REPLACE ALL t2._1dxx  WITH IIF("_"$t1._1d AND "_"$t2._1d OR "_"$t1._1x AND "_"$t2._1x OR "_"$t1._1t AND "_"$t2._1t, "_1DXX", "");
            t2._1dxxf WITH IIF(EMPTY(t2._1dxx), "_1DXXF", "")
SELECT * FROM t1
2020-09-12 22:31
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
从提供的数据看,优化表结构可以提高效率。
如:

程序代码:
**转换结构格式
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-9-13 09:43编辑过]

2020-09-13 09:40
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:5 
以下是引用fdqzy在2020-9-12 20:57:38的发言:

例如下表

对_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
代码应怎样写才能提高运行速度?
最后一行代码有改动

例如能解决问题吗

坚守VFP最后的阵地
2020-09-13 10:59
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



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




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

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