QB64 中的循环优化
Loop optimization in QB64
在QB64中有一个关于循环优化的循环:
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!
是否比
快
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!
已编辑:2018 年 9 月 18 日包括变量类型
我写了这段代码来评估你的测试:
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
两个不同的例程被插入到两个函数中:TRYA
和TRYB
。
我用一个循环运行了 999 次函数的循环启动了这个 SW,结果是:
Avrg. A - B: 0.00204501
0 diff:359 on 999 tryes
然后我启动了 10 次循环,结果是:
Avrg. A - B: -.01640625
0 diff: 1 on 10 tryes
然后我启动了 15 次循环,结果是:
Avrg. A - B: 0.00026042
0 diff: 5 on 15 tryes
因为我们在多线程环境中启动 SW 我不认为这是一个很好的测试,但有一些结果:
- 在两种情况下,没有差异(0 差异)的结果是所有循环的三分之一。
- 在两种情况下,函数
TRYA
似乎较慢。
- 在一种情况下,函数
TRYB
似乎较慢。
看到这些结果,我想,我们可以认为这两个功能是等价的!
您获得了超过 10 个循环 运行 来自命令行的代码(或将 command$ 参数修改为 QB64 菜单)为:
# ./test n
其中 n
是您想要的循环数。
软件是使用带有 -O3 优化选项的 gcc 编译的。 (为此你必须修改文件 [/opt/]qb64/internal/c/makeline_lnx.txt
)
在QB64中有一个关于循环优化的循环:
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!
是否比
快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!
已编辑:2018 年 9 月 18 日包括变量类型
我写了这段代码来评估你的测试:
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
两个不同的例程被插入到两个函数中:TRYA
和TRYB
。
我用一个循环运行了 999 次函数的循环启动了这个 SW,结果是:
Avrg. A - B: 0.00204501
0 diff:359 on 999 tryes
然后我启动了 10 次循环,结果是:
Avrg. A - B: -.01640625
0 diff: 1 on 10 tryes
然后我启动了 15 次循环,结果是:
Avrg. A - B: 0.00026042
0 diff: 5 on 15 tryes
因为我们在多线程环境中启动 SW 我不认为这是一个很好的测试,但有一些结果:
- 在两种情况下,没有差异(0 差异)的结果是所有循环的三分之一。
- 在两种情况下,函数
TRYA
似乎较慢。 - 在一种情况下,函数
TRYB
似乎较慢。
看到这些结果,我想,我们可以认为这两个功能是等价的!
您获得了超过 10 个循环 运行 来自命令行的代码(或将 command$ 参数修改为 QB64 菜单)为:
# ./test n
其中 n
是您想要的循环数。
软件是使用带有 -O3 优化选项的 gcc 编译的。 (为此你必须修改文件 [/opt/]qb64/internal/c/makeline_lnx.txt
)