When we last left off, it had been so long since I did any BASIC programming that I found myself wondering why these two sections of BASIC did not perform as I expected:
0 'bigmazebench.bas 100 P=0:TIMER=0:A=0 110 P=0 120 P=P+2:IF P>479 THEN PRINT:GOTO 110 120 A=A+1:IF A >1000 THEN 150 140 GOTO 120 150 PRINT TIMER 200 P=0:TIMER=0:A=0 210 PRINT:P=0 220 P=P+2:IF P>479 THEN 210 230 A=A+1:IF A>1000 THEN 250 240 GOTO 220 250 PRINT TIMER
William Astle once again saw the obvious (just not obvious to me at the time)…
If you have both versions in the same program, the “backwards” jumps will be slower the later in the program they are because they have to do a sequential scan of the program from the beginning to find the correct line number. If you have been running them in the same program, try separating them and running them independently.– William Astle
Well, duh. Of course. When the block of code starting at line 200 runs, the GOTO 220 has to start at the top of the program and seek past every line to find 220. Much slower compared to how few lines the GOTO 120 has to. Normally my benchmark program is inside a FOR/NEXT loop so there is no line seeking and it behaves the same speed regardless of line number location…
So let’s try them one at a time. I loaded the program and deleted the line 0 comment, and lines 200 and up (DEL 0 and DEL 200-):
100 P=0:TIMER=0:A=0 110 P=0 120 P=P+2:IF P>479 THEN PRINT:GOTO 110 120 A=A+1:IF A >1000 THEN 150 140 GOTO 120 150 PRINT TIMER
This gives me 762.
Then, loading it again, and deleting everything up to 200 (“DEL -199”):
200 P=0:TIMER=0:A=0 210 PRINT:P=0 220 P=P+2:IF P>479 THEN 210 230 A=A+1:IF A>1000 THEN 250 240 GOTO 220 250 PRINT TIMER
That gives me 1394!
Yep, William’s suggestion of moving the PRINT to the destination line, instead of using “THEN PRINT:GOTO xxx” almost doubled the speed it takes to run through that code.
Nicely done, William.
Until next time…