| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6941 人关注过本帖, 2 人收藏
标题:如何提高程序运行速度
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 30楼 fdqzy
逻辑运算
2020-09-14 22:13
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用fdqzy在2020-9-14 19:52:51的发言:

---对筛选数据统计

CLOSE TABLES all
USE b1 IN 0 ALIAS t1
BLANK FIELDS s1_3,s4 all
For i=10 To RECCOUNT()
GO i
p1=ALLTRIM('a')+ALLTRIM('1')
p11=&p1                 &&确定要统计个数的对象
        qs=jnh
        Select * From t1 Where jnh>qs-10 And jnh<=qs Into Cursor ls  &&筛选10行数据
        Count For a1=p11 Or a2=p11  To tj &&对筛选数据统计
            
        Use
        Select t1
        GO i
REPLACE s1_3 with 'S1_3' for tj>0 AND tj<=3 AND RECNO()=i
REPLACE s4 with 'S4' for tj>3 AND RECNO()=i

ENDFOR
brow
如何改进?谢谢!

REPLACE ...... for ...,带FOR子句,如果不指定记录范围相当于 REPLACE ALL
精简部份:
程序代码:
GO 10
SCAN REST
    p11 = a1
    qs = jnh
    SELECT COUNT(*) FROM t1 WHERE BETWEEN(jnh,qs-9,qs) AND (a1=p11 OR a2=p11) INTO ARRAY tj
    REPLACE s1_3 WITH IIF(tj>0 AND tj<=3, 'S1_3', ''), s4 WITH IIF(tj>3, 'S4', '')
ENDSCAN

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


REPLACE ...... for ...,带FOR子句,如果不指定记录范围相当于 REPLACE ALL
精简部份:
GO 10
SCAN REST
    p11 = a1
    qs = jnh
    SELECT COUNT(*) FROM t1 WHERE BETWEEN(jnh,qs-9,qs) AND (a1=p11 OR a2=p11) INTO ARRAY tj
    REPLACE s1_3 WITH IIF(tj>0 AND tj<=3, 'S1_3', ''), s4 WITH IIF(tj>3, 'S4', '')
ENDSCAN

谢谢!明天继续请教。
2020-09-14 22:45
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 33楼 fdqzy
试试这样能快多少
程序代码:
USE b1
BLANK FIELDS s1_3,s4 all
GO TOP
DIMENSION a12[10,2]
COPY TO ARRAY a12 FIELDS a1,a2 NEXT 9
SKIP
SCAN REST
    p11 = a1
    a12[10,1] = a1
    a12[10,2] = a2
    tj = 1
    FOR i=1 TO 9
        IF a12[i,1]=p11 OR a12[i,2]=p11
            tj = tj + 1
        ENDIF
    ENDFOR
    REPLACE s1_3 WITH IIF(tj<4, 'S1_3', ''), s4 WITH IIF(tj>3, 'S4', '')
    ADEL(a12,1) 
ENDSCAN
SELECT * FROM b1



[此贴子已经被作者于2020-9-15 16:22编辑过]

2020-09-15 16:09
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2020-9-15 16:09:51的发言:

试试这样能快多少

USE b1
BLANK FIELDS s1_3,s4 all
GO TOP
DIMENSION a12[10,2]
COPY TO ARRAY a12 FIELDS a1,a2 NEXT 9
SKIP
SCAN REST
    p11 = a1
    a12[10,1] = a1
    a12[10,2] = a2
    tj = 1
    FOR i=1 TO 9
        IF a12[i,1]=p11 OR a12[i,2]=p11
            tj = tj + 1
        ENDIF
    ENDFOR
    REPLACE s1_3 WITH IIF(tj<4, 'S1_3', ''), s4 WITH IIF(tj>3, 'S4', '')
    ADEL(a12,1)
ENDSCAN
SELECT * FROM b1

绝了!
我在前面的代码中测试:
20000条记录耗时1分多钟;
96000多条记录,耗时42分钟
用此代码,耗时1秒多点。
我还正为此事发愁,没想到解决得如此好!
测试数据
b1.rar (96.35 KB)
2020-09-15 16:37
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
回复 35楼 fdqzy
我还没看懂此代码与前面代码的联系,能否解释一下!
另外,统计范围改成固定前9行,加上第10行及以后的1行(共10行)进行统计,
即前面代码的
SELECT COUNT(*) FROM t1 WHERE BETWEEN(jnh,qs-9,qs) AND (a1=p11 OR a2=p11) INTO ARRAY tj
改为
SELECT COUNT(*) FROM t1 WHERE ((jnh>1 And jnh<=9) OR jnh=qs) AND (a1=p11 OR a2=p11) INTO ARRAY tj



 
2020-09-15 16:52
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2020-9-15 16:09:51的发言:

试试这样能快多少

USE b1
BLANK FIELDS s1_3,s4 all
GO TOP
DIMENSION a12[10,2]
COPY TO ARRAY a12 FIELDS a1,a2 NEXT 9
SKIP
SCAN REST
    p11 = a1
    a12[10,1] = a1
    a12[10,2] = a2
    tj = 1
    FOR i=1 TO 9
        IF a12[i,1]=p11 OR a12[i,2]=p11
            tj = tj + 1
        ENDIF
    ENDFOR
    REPLACE s1_3 WITH IIF(tj<4, 'S1_3', ''), s4 WITH IIF(tj>3, 'S4', '')
    ADEL(a12,1)
ENDSCAN
SELECT * FROM b1

前面代码
SELECT COUNT(*) FROM t1 WHERE BETWEEN(jnh,qs-9,qs) AND (a1=p11 OR a2=p11) INTO ARRAY tj
中的BETWEEN(jnh,qs-9,qs)在哪反映?
2020-09-15 17:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用fdqzy在2020-9-15 16:52:40的发言:

我还没看懂此代码与前面代码的联系,能否解释一下!

 

理解是:按 1..10、 2..11、 3..12、...每次10行进行统计。
用数组来存放统计的数据,每次先获取第10行数据,统计完删除第1行数据,删除第1行后后面的数据向前移。
2020-09-15 17:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用fdqzy在2020-9-15 16:52:40的发言:

另外,统计范围改成固定前9行,加上第10行及以后的1行(共10行)进行统计,
即前面代码的

固定前9行:
GO TOP
DIMENSION a12[10,2]
COPY TO ARRAY a12 FIELDS a1,a2 NEXT 9     &&这句是取最前9行
第10行及以后的1行放到 a12[10,1]、a12[10,2]



2020-09-15 18:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用fdqzy在2020-9-15 17:06:09的发言:


前面代码
SELECT COUNT(*) FROM t1 WHERE BETWEEN(jnh,qs-9,qs) AND (a1=p11 OR a2=p11) INTO ARRAY tj
中的BETWEEN(jnh,qs-9,qs)在哪反映?

BETWEEN(jnh,qs-9,qs)就是取连续的10行进行统计
相当于:
    tj = 1  && 因第10行的数据用作条件判断参数,肯定成立,tj最小为1
    FOR i=1 TO 9  && 统计1--9行
        IF a12[i,1]=p11 OR a12[i,2]=p11
            tj = tj + 1
        ENDIF
    ENDFOR

这样做就不用每次COUNT统计时要遍历表,从而大大提高效率。
2020-09-15 20:24
快速回复:如何提高程序运行速度
数据加载中...
 
   



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

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