| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3458 人关注过本帖, 2 人收藏
标题:提高代码的运行速度
取消只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
经过分析影响速度的主要原因是子字符串截取的速度上,在子字符串长度一样的情况下,SUBSTR()速度是最快的,但在本题子字符串的长度不一样的情况下SUBSTR()就用不上了,VFP9中的其它几个函数如:GETWORDNUM()、ALINES()等函数均不理想,只有另起炉灶了。

坚守VFP最后的阵地
2021-04-01 20:49
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
以下是引用吹水佬在2021-4-1 21:07:26的发言:

SUBSTR() + AT() 就可以,但字符串不长,与GETWORDNUM()差别不大。ALINES()因要分配内存和读写操作会耗费一些。

DIMENSION az[100]
USE sp
t1 = SECONDS()
n = GETWORDCOUNT(jmss1, ",")
FOR i=1 TO n
    STORE 0 TO az
    SCAN
        j = (VAL(GETWORDNUM(jmss1,i,","))+1) * 10
        az[j] = az[j]+1
    ENDSCAN
ENDFOR
? SECONDS() - t1

FOR i=1 TO 100
    IF az[i] > 0
        ? i/10-1, az[i]
    ENDIF
ENDFOR

吹版的代码在我的电脑上运行时间为1.2秒左右


吹版的代码精简效率高,我的又一个版本也是你这个数组思路,但是代码比你的多了不少行,判断也多,故而效率也低了不少,向吹版学习致敬!
程序代码:
T1 = SECONDS()
CLOSE DATABASES 
USE 选择\sp ALIAS aa
ln = OCCURS(",", jmss1) + 1 && 获取题目的数量
FOR lnj = 1 TO ln
    lnCnt = 0
    RELEASE la
    LOCAL la[10, 2]
    SCAN
        lnfz = VAL(GETWORDNUM(jmss1, lnj, ",")) &&VAL(SUBSTR(jmss1, 2 *lnj - 1, 1))
        IF ASCAN(la, lnfz, 1, ALEN(la, 1), 1) = 0
            lnCnt = lnCnt + 1
            la[lnCnt, 1] = lnfz
            la[lnCnt, 2] = 1
        ELSE 
            lnRow = (ASCAN(la, lnfz, 1, ALEN(la, 1), 1) + 1) / 2
            la[lnRow, 2] = la[lnRow, 2] + 1
        ENDIF 
    ENDSCAN 
ENDFOR 
MESSAGEBOX(SECONDS() - T1)
FOR lnj = 1 TO ALEN(la, 1)
    IF ASCAN(la, .F., 1, ALEN(la, 1), 1) > 0
        lnCnt = (ASCAN(la, .F., 1, ALEN(la, 1), 1) + 1) / 2
        EXIT 
    ENDIF 
ENDFOR
DIMENSION la(lnCnt - 1, 2)
ASORT(la)
LIST MEMORY LIKE la && 最后一题的数组结果

我的这段代码运行时间为2.4秒左右

[此贴子已经被作者于2021-4-1 21:26编辑过]


坚守VFP最后的阵地
2021-04-01 21:20
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
回复 26楼 吹水佬
结果完全正确
因为后期还要处理每题的其它几个指标:如平均分,最高分,满分率,零分率,有了分值及对应的人数,计算这几个指标的运行时间可以忽略不计。这是去年帮别人做的一个指标统计处理小程序,当时用的就是瓜瓜在前面贴出的SQL代码,最近闲来无事,把这个问题重新找出来了,看只用VFP命令(不用SQL查询)与SQL查询时间的差距有多大,现在看来运行时间差不多,大约3-5秒左右的误差。考试科目共7门,现在讨论的题目只是其中的一门,还有一门课程的题目有50多题,刚才运行了吹版的代码,运行时间在17秒左右。如果试题在10题内,每题运行时间在0.15秒,但是55题每题运行时间在0.3秒左右,这是什么原因?吹版能帮解释一下吗

坚守VFP最后的阵地
2021-04-01 21:50
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
以下是引用ycvf在2021-4-1 21:57:55的发言:

能举例说明吗?

? GETWORDNUM("A,B,CW, D890,    123E", 5, ",")

[此贴子已经被作者于2021-4-1 22:04编辑过]


坚守VFP最后的阵地
2021-04-01 22:00
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
回复 33楼 吹水佬
吹版第一部分的代码,我也曾有过类似想法,后放弃,不过还是谢谢吹版。

坚守VFP最后的阵地
2021-04-02 06:53
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
以下是引用mywisdom88在2021-4-2 08:40:25的发言:

我运行吹版的,也就0.8秒
但楼主的,就要190多秒

可能与工作区转换有关系,这种情况我也遇到过,具体原因说不清楚。

坚守VFP最后的阵地
2021-04-02 08:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9820
专家分:27081
注 册:2012-2-5
收藏
得分:0 
谢谢大家的帮助、关注
如果有不同想法的朋友可以继续留言

坚守VFP最后的阵地
2021-04-04 09:31
快速回复:提高代码的运行速度
数据加载中...
 
   



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

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