3

以下两个(功能等效)程序取自旧版 Compute's Gazette。主要区别在于程序 1 将目标基本内存位置(7680 和 38400)内联,而程序 2 首先将它们分配给变量。

程序 1 的运行速度比程序 2 慢 50%。为什么?我认为额外的变量检索会增加时间,而不是减少时间!

10 PRINT"[CLR]":A=0:TI$="000000"
20 POKE 7680+A,81:POKE 38400+A,6:IF A=505 THEN GOTO 40
30 A=A+1:GOTO 20
40 PRINT TI/60:END

程序 1

10 PRINT "[CLR]":A=0:B=7600:C=38400:TI$="000000"
20 POKE B+A,81:POKE C+A,6:IF A=505 THEN GOTO 40
30 A=A+1:GOTO 20
40 PRINT TI/60:END

节目二

4

3 回答 3

2

原因是 BASIC 在这里被完全解释,因此字符串“7680”和“38400”需要每次到达第 20 行(在这个程序中为 506 次)都转换为二进制整数。在程序 2 中,它们被转换一次并存储在B. 因此,只要搜索和获取的B速度比转换字符串到二进制的速度快,程序 2 就会更快。

如果您要使用 BASIC 编译器(不确定是否存在适用于 VIC-20 的编译器,但这将是一个很酷的复古编程项目),那么这些程序可能具有相同的速度,或者 1 可能会稍快一些,具体取决于关于编译器做了哪些优化。

于 2010-08-25T18:39:01.780 回答
2

来自本期第 76 页:http ://www.scribd.com/doc/33728028/Compute-Gazette-Issue-01-1983-Jul

我曾经很喜欢这本杂志。它实际上说提高了 30%。看看程序 2 中发生的事情就很清楚了,因为您使用变量进行了很多循环,程序正在预先进行所有内存分配以计算内存地址。当您使用较慢的方法时,每次迭代都必须为下面突出显示的部分分配内存,作为计算内存地址的一部分:

7680 +A,81:戳38400 +A

这正是 VIC 上 BASIC 解释器的本质。

于 2010-08-25T18:21:33.833 回答
0

访问第一个定义的变量会很快;第二个会慢一些,等等。解析多位常量需要解释器执行重复乘以十。我不知道变量和常量之间的确切权衡是什么,但是短变量名使用的空间比多位常量少。顺便说一下,如果将常量零写成单个小数点(没有数字),则可能会比写成数字零更快地解析常量零。

于 2010-10-02T19:43:52.187 回答