首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QB64中的循环优化

QB64中的循环优化
EN

Stack Overflow用户
提问于 2018-09-18 05:00:32
回答 1查看 240关注 0票数 1

在QB64中有一个有关循环优化的循环:

代码语言:javascript
复制
DIM N AS DOUBLE, X(100000000) AS DOUBLE
T! = TIMER
FOR N = 1 to 100000000
    IF X(N) THEN
        PRINT X(N)
        EXIT FOR
    END IF
NEXT
PRINT TIMER - T!

是否比以下速度更快:

代码语言:javascript
复制
DIM N AS DOUBLE, X(100000000) AS DOUBLE
T! = TIMER
FOR N = 1 to 100000000
    IF X(N) <> 0  THEN
        PRINT X(N)
        EXIT FOR
    END IF
NEXT
PRINT TIMER - T!

编辑: 09-18-2018,包括可变类型

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-03 13:20:23

我编写了这段代码来评估您的测试:

代码语言:javascript
复制
REM Delete REM to enable console runs
REM $CONSOLE:ONLY
REM _DEST _CONSOLE

DIM SHARED N AS DOUBLE, X(100000000) AS DOUBLE

S# = 0: ZC% = 0
T% = 10
IF COMMAND$ <> "" THEN
    T% = VAL(COMMAND$)
END IF

IF T% > 999 THEN T% = 999

FOR I% = 1 TO T%
    A# = TRYA
    B# = TRYB

    D# = A# - B#
    PRINT USING "Case A ... : #.########"; A#
    PRINT USING "Case B ... : #.########"; B#
    PRINT USING "Diff ..... : #.########"; D#;

    A$ = ""
    IF ABS(D#) < 0.00000001 THEN
        ZC% = ZC% + 1
        A$ = "*"
    END IF

    S# = S# + A# - B#

    PRINT A$
    PRINT

    REM INKEY$ doesn't work in console mode!
    A$ = INKEY$
    IF A$ = CHR$(27) THEN
        I% = I% + 1: EXIT FOR
    END IF
NEXT

PRINT USING "Avrg A - B : #.########"; S# / (I% - 1)
PRINT USING "0 diff:### on ### tryes"; ZC%, (I% - 1)
PRINT

PRINT "Hit a key to exit!"
REM INPUT$ doesn't work in console mode!
A$ = INPUT$(1)
SYSTEM


FUNCTION TRYA#
    T# = TIMER
    FOR N = 1 TO 100000000
        IF X(N) THEN
            PRINT X(N)
            EXIT FOR
        END IF
    NEXT
    A# = TIMER - T#

    TRYA = A#
END FUNCTION

FUNCTION TRYB#
    T# = TIMER
    FOR N = 1 TO 100000000
        IF X(N) <> 0 THEN
            PRINT X(N)
            EXIT FOR
        END IF
    NEXT
    A# = TIMER - T#

    TRYB = A#
END FUNCTION

这两个不同的例程被插入到两个函数中:TRYATRYB

我用一个循环启动了这个SW,运行999倍的函数,结果是:

代码语言:javascript
复制
Avrg. A - B: 0.00204501
0 diff:359 on 999 tryes

然后我启动了一个10次循环,结果是:

代码语言:javascript
复制
Avrg. A - B: -.01640625
0 diff:  1 on  10 tryes

然后我启动了一个15次循环,结果是:

代码语言:javascript
复制
Avrg. A - B: 0.00026042
0 diff:  5 on  15 tryes

因为我们在多线程环境下启动了SW,我不认为这是一个很好的测试,但是有一些结果:

  1. 在两种情况下,无差异(0diff)的结果占所有循环的三分之一。
  2. 在两种情况下,函数TRYA似乎要慢一些。
  3. 在一种情况下,TRYB函数的速度似乎要慢一些。

看看这些结果,我想,我们可以认为这两个函数等价!

在命令行(或将命令$参数修改为QB64菜单)中运行代码的循环超过10个,如下所示:

# ./test n

其中n是您想要的循环数。

SW是使用gcc和-O3优化选项编译的。(要做到这一点,必须修改文件[/opt/]qb64/internal/c/makeline_lnx.txt)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52379239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档