| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6600 人关注过本帖, 2 人收藏
标题:如何提高程序运行速度
取消只看楼主 加入收藏
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
老师:
这种代码没学过,必须读懂,才能依样画葫芦仿照运用,不枉老师的一片心。
我的理解如下(有的是错误的,请指正):
程序代码:
USE b1
BLANK FIELDS s1_3,s4 all
GO TOP
DIMENSION a12[10,2]  &&定义二维数据变量,10-要统计的10行,2-列数(如果是3列就是a12[10,3])
COPY TO ARRAY a12 FIELDS a1,a2 NEXT 9  &&复制当前和下9条记录(这个理解可能是错误的)

SKIP  && 指针下移(是如何移到第10行的 ?,如果前面“GO TOP”改为"GO 2",这里就是下移到第11行?)
SCAN REST &&从第10行开始扫描
    p11 = a1
    a12[10,1] = a1
    a12[10,2] = a2
    tj = 1  &&为什么初始值斌“1”?
    FOR i=1 TO 9 &&从1行到9行统计
        IF a12[i,1]=p11 OR a12[i,2]=p11
            tj = tj + 1  &&如果 a12[i,1]、a12[i,2]都等于p11,这个成立否?
        ENDIF
    ENDFOR
    REPLACE s1_3 WITH IIF(tj<4, 'S1_3', ''), s4 WITH IIF(tj>3, 'S4', '')
    ADEL(a12,1) &&删除数组第1行元素
ENDSCAN
SELECT * FROM b1

这是按1-10,2-11,3-12....进行统计的
如果要固定前9行,再与10行及以后每1行组成10行统计(即前9行+第10行,前9行+第11行,前9行+第12行.....)
应如何修改代码?

麻烦了!

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

2020-09-15 20:50
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用csyx在2020-9-16 04:37:42的发言:

先学好走,再考虑跑
3楼代码的主要问题,是对 replace 命令的作用范围不够了解
正如吹版在32楼指出的,带 for 子句的 replace 作用范围是 all,这在 vfp 的帮助里有明确的说明
因此,如果有 N 条记录,你的 for循环 + replace 要遍历整个表 N * N 次
(假设表没有任何索引,或者有但却无法被 vfp 的 rushmore 利用)

所以,你只要给 replace 加上范围子句,就可以简单的让运行时间得到根本性改变
例如第一条:REPLACE Next 1 _1dxx WITH '_1DXX' FOR '_'$k_1d AND '_'$_1d      && AND RECNO()=i

说得对,学识太浅,在解决实际问题的同时去学习。
2020-09-16 08:56
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
再请教关于行统计的问题:
我的常规处理办法是
程序代码:
create cursor b1 (c1 N(3),c2 N(3),m c(3))
insert into b1 values (70,54,"")
insert into b1 values (58,54,"")
insert into b1 values (49,86,"")
insert into b1 values (66,86,"")
insert into b1 values (75,96,"")

FOR i=1 TO RECCOUNT()
GO i
kk=''
IF c1>=60
kk=kk+'1'
ENDIF
IF c1<60
kk=kk+'0'
ENDIF
IF c2>=60
kk=kk+'1'
ENDIF
IF c2<60
kk=kk+'0'
ENDIF
GO i
REPLACE m WITH ALLTRIM(kk) 
endfor


统计:
程序代码:
create cursor b1 (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),p1 c(3),p2 c(3),p3 c(3))
insert into b1 values ("M1","","M3","M4","","","","")
insert into b1 values ("M1","","","M4","","","","")
insert into b1 values ("","M2","M3","M4","M5","","","")
insert into b1 values ("","","","M4","","","","")
insert into b1 values ("","","M3","M4","M5","","","")

FOR i=1 TO RECCOUNT()
GO i
kk=0
IF 'M'$m1
kk=kk+1
ENDIF
IF 'M'$m2
kk=kk+1
ENDIF
IF 'M'$m3
kk=kk+1
ENDIF
IF 'M'$m4
kk=kk+1
ENDIF
IF 'M'$m5
kk=kk+1
ENDIF
GO i
REPLACE p1 WITH 'P1' FOR kk=1 AND RECNO()=i
REPLACE p2 WITH 'P2' FOR kk=2 AND RECNO()=i
REPLACE p3 WITH 'P3' FOR kk>2 AND RECNO()=i

endfor

求简捷的处理方法!

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

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

create cursor b1 (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),p1 c(3),p2 c(3),p3 c(3))
insert into b1 values ("M1","","M3","M4","","","","")
insert into b1 values ("M1","","","M4","","","","")
insert into b1 values ("","M2","M3","M4","M5","","","")
insert into b1 values ("","","","M4","","","","")
insert into b1 values ("","","M3","M4","M5","","","")
SCAN
    n1 = OCCURS("M", m1 + m2 + m3 + m4 + m5)
    n1 = IIF(n1 > 3, 3, n1)
    REPLACE ("P" + TRANSFORM(n1)) WITH "P" + TRANSFORM(n1)
ENDSCAN
BROWSE

谢谢了!
2020-09-16 16:37
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用sdta在2020-9-16 15:18:57的发言:

我一直坚持先学后用,不是现学现用,原因大家可以自己去想像

应该是这样,我现在发的帖子,是以前学6.0时的代码,且是目前因工作需要解决不了,故求助,也学到了不少知识,以后要多学。
2020-09-16 16:43
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2020-9-16 16:24:38的发言:


一句
REPLACE ALL m WITH IIF(c1<60,"0","1") + IIF(c2<60,"0","1")

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


近来比较强调“内循环”
kk=0
REPLACE ALL ;
    p1 WITH IIF(fun()=1, 'P1', ''),;
    p2 WITH IIF(kk=2, 'P2', ''),;
    p3 WITH IIF(kk>2, 'P3', '')
SELECT * FROM b1
RETURN

FUNCTION fun()
    kk = OCCURS("M",m1+m2+m3+m4+m5)
    RETURN kk
ENDFUNC

在老师的指导下,我仿照如下:
程序代码:
create cursor b1 (m1 c(2),m2 c(2),m3 c(2),m4 c(2),m5 c(2),p1 c(3),p2 c(3),p3 c(3))
insert into b1 values ("M1","","M3","M4","","","","")
insert into b1 values ("M1","","","M4","","","","")
insert into b1 values ("","M2","M3","M4","M5","","","")
insert into b1 values ("","","","M4","","","","")
insert into b1 values ("","","M3","M4","M5","","","")

REPLACE ALL ;
            p1 WITH IIF(OCCURS("M", m1 + m2 + m3 + m4 + m5)=1 ,"P1", "");
            p2 WITH IIF(OCCURS("M", m1 + m2 + m3 + m4 + m5)=2 ,"P2", "");
            p3 WITH IIF(OCCURS("M", m1 + m2 + m3 + m4 + m5)>2 ,"P3", "")

可以否?
2020-09-16 17:30
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用sdta在2020-9-16 17:01:47的发言:

编程三步曲
一:思路
二:方法
三:代码优化

谢谢!这是我应该努力的方向。
2020-09-16 17:33
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
通过近几天老师的指教,基本上找到了我原代码运行效率不高的原因,以及解决问题的思路,给工作中解决实际问题带来了极大的方便。
谢谢各位老师!请今后多指教。
2020-09-16 18:03
fdqzy
Rank: 1
等 级:新手上路
帖 子:368
专家分:0
注 册:2016-8-15
收藏
得分:0 
以下是引用吹水佬在2020-9-16 18:01:28的发言:

可以,但用OCCURS重复做同一件事有点浪费时间。

谢谢指教!
2020-09-16 18:04
快速回复:如何提高程序运行速度
数据加载中...
 
   



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

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