标题:如何提高程序运行速度
只看楼主
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-13 19:57:05的发言:

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

因数据结构需要,要多次用到列变量,应如何处理?再嵌套循环吗?
2020-09-13 20:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用fdqzy在2020-9-13 20:57:23的发言:


因数据结构需要,要多次用到列变量,应如何处理?再嵌套循环吗?

可用EVALUATE()来解释运行动态运算表达式,能不用宏替换就不用。
程序代码:
USE b1 IN 0 ALIAS t1
USE b1 IN 0 ALIAS t2 AGAIN 
SELECT t1
SET RELATION TO RECNO()+1 INTO "t2"
p1=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('1')    && 按实际定义动态运算表达式
k1=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('1')
p2=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('2')
k2=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('2')
REPLACE ALL t2._1d WITH IIF(EVALUATE(k1+">"+p1), "_1D", "");
            t2._1x WITH IIF(EVALUATE(k1+"<"+p1), "_1X", "");
            t2._1t WITH IIF(EVALUATE(k1+"="+p1), "_1T", "");
            t2._2d WITH IIF(EVALUATE(k2+">"+p2), "_2D", "");
            t2._2x WITH IIF(EVALUATE(k2+"<"+p2), "_2X", "");
            t2._2t WITH IIF(EVALUATE(k2+"="+p2), "_2T", "")
SET RELATION TO
SELECT * FROM t1
2020-09-13 22:19
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-13 22:19:25的发言:


可用EVALUATE()来解释运行动态运算表达式,能不用宏替换就不用。
USE b1 IN 0 ALIAS t1
USE b1 IN 0 ALIAS t2 AGAIN
SELECT t1
SET RELATION TO RECNO()+1 INTO "t2"
p1=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('1')    && 按实际定义动态运算表达式
k1=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('1')
p2=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('2')
k2=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('2')
REPLACE ALL t2._1d WITH IIF(EVALUATE(k1+">"+p1), "_1D", "");
            t2._1x WITH IIF(EVALUATE(k1+"<"+p1), "_1X", "");
            t2._1t WITH IIF(EVALUATE(k1+"="+p1), "_1T", "");
            t2._2d WITH IIF(EVALUATE(k2+">"+p2), "_2D", "");
            t2._2x WITH IIF(EVALUATE(k2+"<"+p2), "_2X", "");
            t2._2t WITH IIF(EVALUATE(k2+"="+p2), "_2T", "")
SET RELATION TO
SELECT * FROM t1

漂亮,又学一招!
2020-09-14 04:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 23楼 fdqzy
用 EXECSCRIPT() 解释执行动态语句效率相对会更好些
如:
p1=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('1')
k1=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('1')
p2=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('2')
k2=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('2')
cmd = "REPLACE ALL "+;
      "t2._1d WITH IIF(" + k1 + ">" + p1 + ", '_1D', ''),"+;
      "t2._1x WITH IIF(" + k1 + "<" + p1 + ", '_1X', ''),"+;
      "t2._1t WITH IIF(" + k1 + "=" + p1 + ", '_1T', ''),"+;
      "t2._2d WITH IIF(" + k2 + ">" + p2 + ", '_2D', ''),"+;
      "t2._2x WITH IIF(" + k2 + "<" + p2 + ", '_2X', ''),"+;
      "t2._2t WITH IIF(" + k2 + "=" + p2 + ", '_2T', '')"   
EXECSCRIPT(cmd)
2020-09-14 11:28
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-14 11:28:17的发言:

用 EXECSCRIPT() 解释执行动态语句效率相对会更好些
如:
p1=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('1')
k1=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('1')
p2=ALLTRIM("t1.")+ALLTRIM('a')+ALLTRIM('2')
k2=ALLTRIM("t2.")+ALLTRIM('a')+ALLTRIM('2')
cmd = "REPLACE ALL "+;
      "t2._1d WITH IIF(" + k1 + ">" + p1 + ", '_1D', ''),"+;
      "t2._1x WITH IIF(" + k1 + "<" + p1 + ", '_1X', ''),"+;
      "t2._1t WITH IIF(" + k1 + "=" + p1 + ", '_1T', ''),"+;
      "t2._2d WITH IIF(" + k2 + ">" + p2 + ", '_2D', ''),"+;
      "t2._2x WITH IIF(" + k2 + "<" + p2 + ", '_2X', ''),"+;
      "t2._2t WITH IIF(" + k2 + "=" + p2 + ", '_2T', '')"   
EXECSCRIPT(cmd)

好,比原来快很多!
2020-09-14 13:57
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
与固定行数据比较
b4.rar (1.42 KB)

程序代码:
CLOSE TABLES all
USE b4 
GO 1  &&固定被比较的行
k1=_1d
k2=_1x
k3=_1t
FOR i=2 TO RECCOUNT()  &&以下数据与第1行数据比较
GO i
REPLACE _1dxx WITH '_1DXX' FOR '_'$k1 AND '_'$_1d AND RECNO()=i  &&与第1行同列值相同
REPLACE _1dxx WITH '_1DXX' FOR '_'$k2 AND '_'$_1x AND RECNO()=i
REPLACE _1dxx WITH '_1DXX' FOR '_'$k3 AND '_'$_1t AND RECNO()=i
REPLACE _1dxxf WITH '_1DXXF' FOR NOT '_'$_1dxx AND ('_'$k1 OR '_'$k2 OR '_'$k3) AND RECNO()=i
endfor

运行很慢,麻烦优化一下,谢谢!

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

2020-09-14 15:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 26楼 fdqzy
尽量不用或少用循环,遍历表用SCAN效率高些
试试这样:
USE b4
GO 1  &&固定被比较的行
k1 = '_'$_1d
k2 = '_'$_1x
k3 = '_'$_1t
kk = k1 OR k2 OR k3
GO 2
REPLACE REST _1dxx WITH IIF((k1 AND '_'$_1d) OR (k2 AND '_'$_1x) OR (k3 AND '_'$_1t), '_1DXX', ''),;
             _1dxxf WITH IIF((NOT '_'$_1dxx) AND kk, '_1DXXF', '')
2020-09-14 17:09
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-14 17:09:49的发言:

尽量不用或少用循环,遍历表用SCAN效率高些
试试这样:
USE b4
GO 1  &&固定被比较的行
k1 = '_'$_1d
k2 = '_'$_1x
k3 = '_'$_1t
kk = k1 OR k2 OR k3
GO 2
REPLACE REST _1dxx WITH IIF((k1 AND '_'$_1d) OR (k2 AND '_'$_1x) OR (k3 AND '_'$_1t), '_1DXX', ''),;
             _1dxxf WITH IIF((NOT '_'$_1dxx) AND kk, '_1DXXF', '')

妙!
由于所学知识太少,以前基本都用循环,所以效率低,在老师的指导下,改变传统编程方法。

[此贴子已经被作者于2020-9-14 19:53编辑过]

2020-09-14 19:41
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
---对筛选数据统计
b1.rar (1.8 KB)

程序代码:
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

如何改进?谢谢!
2020-09-14 19:52
fdqzy
Rank: 1
等 级:新手上路
帖 子:354
专家分:0
注 册:2016-8-15
得分:0 
以下是引用吹水佬在2020-9-14 17:09:49的发言:

kk = k1 OR k2 OR k3

这样设变量,没见过!
2020-09-14 19:57



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




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

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