标题:提高代码的运行速度
只看楼主
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
得分:0 
以下是引用mywisdom88在2021-4-1 12:58:55的发言:


我的晕死,190秒

是不是水土不服
两台电脑的配置那个好
2021-04-01 13:09
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
用5楼的,才0.6秒
2021-04-01 13:28
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
把程序放到C盘,变成144秒(C盘是固态盘,I是以前的机械盘)
把这个,去掉,就变成1.6秒,速度和写盘,有很大关系
        IF SEEK(VAL(GETWORDNUM(aa.jmss1, lnj, ",")), "fz", "fz") = .T.
      *      REPLACE nsl WITH nsl + 1 IN fz
        ELSE
      *     INSERT INTO fz VALUES (VAL(GETWORDNUM(aa.jmss1, lnj, ",")), 1)
        ENDIF
********************************


SET DEFAULT TO c:\abc
T1 = SECONDS()
CLOSE DATABASES
USE 选择\sp ALIAS aa
ln = OCCURS(",", jmss1) + 1 && 获取题目的数量
FOR lnj = 1 TO ln
    CREATE CURSOR fz (nfz n(4, 2), nsl I) && 保存分值的
    INDEX on nfz TAG fz
    SELECT aa
    SCAN
        IF SEEK(VAL(GETWORDNUM(aa.jmss1, lnj, ",")), "fz", "fz") = .T.
            REPLACE nsl WITH nsl + 1 IN fz
        ELSE
            INSERT INTO fz VALUES (VAL(GETWORDNUM(aa.jmss1, lnj, ",")), 1)
        ENDIF
    ENDSCAN
ENDFOR
MESSAGEBOX(SECONDS() - T1)
2021-04-01 13:40
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
向各位学习!


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

2021-04-01 13:52
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
6楼的代码应该比5楼的代码运行慢

坚守VFP最后的阵地
2021-04-01 14:41
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
以下是引用mywisdom88在2021-4-1 13:40:57的发言:

把程序放到C盘,变成144秒(C盘是固态盘,I是以前的机械盘)
把这个,去掉,就变成1.6秒,速度和写盘,有很大关系
        IF SEEK(VAL(GETWORDNUM(aa.jmss1, lnj, ",")), "fz", "fz") = .T.
      *      REPLACE nsl WITH nsl + 1 IN fz
        ELSE
      *     INSERT INTO fz VALUES (VAL(GETWORDNUM(aa.jmss1, lnj, ",")), 1)
        ENDIF
********************************


SET DEFAULT TO c:\abc
T1 = SECONDS()
CLOSE DATABASES
USE 选择\sp ALIAS aa
ln = OCCURS(",", jmss1) + 1 && 获取题目的数量
FOR lnj = 1 TO ln
    CREATE CURSOR fz (nfz n(4, 2), nsl I) && 保存分值的
    INDEX on nfz TAG fz
    SELECT aa
    SCAN
        IF SEEK(VAL(GETWORDNUM(aa.jmss1, lnj, ",")), "fz", "fz") = .T.
            REPLACE nsl WITH nsl + 1 IN fz
        ELSE
            INSERT INTO fz VALUES (VAL(GETWORDNUM(aa.jmss1, lnj, ",")), 1)
        ENDIF
    ENDSCAN
ENDFOR
MESSAGEBOX(SECONDS() - T1)

是不是说固态盘影响数据的写入

坚守VFP最后的阵地
2021-04-01 14:51
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:20 
我的代码,按照要求不用任何Select ... 语句 ,另辟蹊径用了字典对象,供大家参考:
程序代码:
IF NOT USED('sp') THEN 
    USE "C:\sp.dbf" IN 0 EXCLUSIVE  &&  改成你的路径 
ENDIF 
LOCAL icnt as Integer ,ii as Integer 
LOCAL ckey as String ,str1 as String 
LOCAL time11 as Datetime ,time22 as Datetime 

IF  USED('result1') THEN 
    USE IN result1
ENDIF 

LOCAL  oDic As Object
oDic = CreateObject("Scripting.Dictionary")
time11 = SECONDS()
SELECT sp
GO TOP 
SCAN 
    str1 = ALLTRIM(sp.jmss1)
    icnt = ALINES(arr2,str1,1,",")
    FOR ii =1 TO icnt 
        ckey = LTRIM(STR(ii)) - "_" - arr2(ii)
        IF odic.Exists(ckey) THEN 
            odic.Item(ckey) = odic.Item(ckey) + 1
        ELSE 
            odic.Add( ckey,1) && 
        ENDIF     
    ENDFOR 

ENDSCAN 

DIMENSION arrKey(1) as String 
arrKey =odic.Keys

CREATE CURSOR result1 (第几题 c(4) , 分值 c(4),次数 i )
FOR ii = 1 TO odic.Count  && 
*!*        tmp11 = LEFT(arrKey(ii), AT('_',arrKey(ii)) -1)
*!*        tmp22 = SUBSTR(arrKey(ii), AT('_',arrKey(ii)) +1)
*!*        tmp33 = odic.Item(arrKey(ii)) 
    
    INSERT INTO result1 (第几题  , 分值 ,次数  ) ;
        VALUES ( LEFT(arrKey(ii), AT('_',arrKey(ii)) -1),  ;
                SUBSTR(arrKey(ii), AT('_',arrKey(ii)) +1), ;
                odic.Item(arrKey(ii)) )
ENDFOR 
time22 = SECONDS()
odic.RemoveAll
RELEASE oDic
SELECT result1
INDEX on 第几题 + 分值 TO 'C:\ind12'   &&  改成你的路径

BROWSE TITLE "总耗时" +  LTRIM(STR(time22 - time11 ,14,4 )) 

在我的电脑上运行结果:

收到的鲜花
  • 瓜瓜19902021-04-01 20:39 送鲜花  2朵  
  • schtg2021-04-03 05:48 送鲜花  2朵  
2021-04-01 17:15
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
回复 16楼 sdta
我电脑WIN7 64,8G内存
但不知道,为什么这么慢
1个120G固态硬盘,做C盘,其他的是,D,E,F,G,I是机械硬盘
2021-04-01 17:21
ycvf
Rank: 2
等 级:论坛游民
帖 子:209
专家分:56
注 册:2012-8-25
得分:0 
这个函数GETWORDNUM(jmss1, lnj, ",")没见过,有知道的吗、

落花人独立,微雨燕双飞。
2021-04-01 17:44
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
以下是引用mywisdom88在2021-4-1 17:21:14的发言:

我电脑WIN7 64,8G内存
但不知道,为什么这么慢
1个120G固态硬盘,做C盘,其他的是,D,E,F,G,I是机械硬盘

对于硬件我是绝对外行

坚守VFP最后的阵地
2021-04-01 17:46



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




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

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