BBC Basic Optimise 1

Here I describe a few simple tricks to make your programs run better.

To help speed up your BBS Basic programs here are some tips. They are meant as simple substitution to your existing code and a guide to better coding in the future. These are not an exhaustive list and have been created from reading stuff and trial and error so there is no warranty here!

IF AND vs IF THEN IF

With IF AND statements all parts of the expression are evaluated. These can easily be replaced with IF THEN IF which do the same job but if any conditional test fails then the rest of the statement does not both to execute!

So this:

IF X%>0 AND Y%>0 THEN I%=1

Is the same as:

IF X%>0 THEN IF Y%>0 THEN I%=1

But in execution if X%<>0 then the rest of the statement is not executed, a nice return.

In practice this can be a massive difference in performance. Here is a simple program that can test this:

   10 MODE 7
   20 PRINT "BBC BASIC PERFORMANCE TESTS"
   30 PRINT "==========================="
   40 REM GET MACHINE TYPE
   50 Q%=1000 : REM DEFAULT TO BBC
   60 IF TOP> 300000000 THEN Q%=100000: PRINT "PC MODE" ELSE Q%=1000: PRINT "BBC MODE"
   70
   80 PRINT "IF AND vs IF THEN IF"
   90 Z%=0
  100
  110 PRINT "IF AND TEST"
  120
  130 TIME=0
  140 T = TIME
  150
  160 FOR I%=1 TO Q%
  170   FOR J%=1 TO 5
  180     IF J%=1 AND J%>0 THEN Z%=1
  190     IF J%=2 AND J%>0 THEN Z%=2
  200     IF J%=3 AND J%>0 THEN Z%=3
  210     IF J%=4 AND J%>0 THEN Z%=4
  220     IF J%=5 AND J%>0 THEN Z%=5
  230   NEXT
  240 NEXT I%
  250
  260 PRINT "TIME:";(TIME-T%);"  "
  270
  280 PRINT "IF THEN IF THEN TEST"
  290
  300 TIME=0
  310 T = TIME
  320
  330 FOR I%=1 TO Q%
  340   FOR J%=1 TO 5
  350     IF J%=1 THEN IF J%>0 THEN Z%=1
  360     IF J%=2 THEN IF J%>0 THEN Z%=2
  370     IF J%=3 THEN IF J%>0 THEN Z%=3
  380     IF J%=4 THEN IF J%>0 THEN Z%=4
  390     IF J%=5 THEN IF J%>0 THEN Z%=5
  400   NEXT
  410 NEXT I%
  420
  430 PRINT "TIME:";(TIME-T%);"  "

Here are the results running on the BBCBasic IDE on a Windows PC:

What is clear is that the THEN IF is massively quicker!

A quick note on the program. At the top of the listing there is a check against TOP, which returns the top of memory. It is a simple way to detect if you are running on the PC or a BBC. It sets the correct Q% value that is used to govern the number of loops to take during the tests.

Here is the same program running on a BBC:

On the BeeB there is still a massive difference.

With lots of conditional tests in a loop it is a big upgrade.

FLOAT vs INTEGER, NEXT <VAR> and IF CONST/VAR

Use integer rather than floats.

For probably most programs you don’t need floats. If you are using variables with a range of say 1 to 10 then floats are pointless.

Omit the variable on NEXT statements

When in a FOR – NEXT loop you typically specify the variable in the NEXT. In fact this is not needed for program flow and it actually cost more in CPU cycles as the variable has to be interpreted:

FOR A%=1 TO 10:REM DO SOMETHING:NEXT A%

If slower then:

FOR A%=1 TO 10:REM DO SOMETHING:NEXT

Use variables rather then constants in conditionals

When testing a condition against a constant such as:

IF X%=10 THEN REM DO SOMETHING

It turns out to be slower than:

Z%=10
IF X%=Z% THEN REM DO SOMETHING

Looks odd but just like the NEXT the interpreter has to pass what 10 is rather then passing a reference to the variable value in memory. Of course in this case you should place Z%=10 somewhere at the top of the program and make use of this technique if you are using it more than a couple of times.

Here is a program to test this:

   10 MODE 7
   20 PRINT "BBC BASIC PERFORMANCE TESTS"
   30 PRINT "==========================="
   40 REM GET MACHINE TYPE
   50 Q%=1000 : REM DEFAULT TO BBC
   60 IF TOP> 300000000 THEN Q%=10000000: PRINT "PC MODE" ELSE Q%=5000: PRINT "BBC MODE"
   70
   80
   90 PRINT "LOOP WITH FLOAT"
  100 TIME=0
  110 T = TIME
  120 FOR X=1 TO Q%:NEXT X:
  130 PRINT "        TIME:";(TIME-T%)
  140
  150
  160 PRINT "LOOP WITH INTEGER"
  170 TIME=0
  180 T = TIME
  190 FOR X%=1 TO Q%:NEXT X%
  200 PRINT "        TIME:";(TIME-T%)
  210
  220
  230 PRINT "LOOP WITH INTEGER WITHOUT NEXT <VAR>"
  240 TIME=0
  250 T = TIME
  260 FOR X%=1 TO Q%:NEXT
  270 PRINT "        TIME:";(TIME-T%)
  280
  290
  300 PRINT "CONDITIONAL BY CONSTANT"
  310 TIME=0
  320 T = TIME
  330 FOR I%=1 TO Q%
  340   IF I%=10 THEN O=O+1
  350 NEXT I%
  360 PRINT "        TIME:";(TIME-T%)
  370
  380
  390 PRINT "CONDITIONAL BY VARIABLE"
  400 TIME=0
  410 T = TIME
  420 J%=10
  430 FOR I%=1 TO Q%
  440   IF I%=J% THEN O=O+1
  450 NEXT I%
  460 PRINT "        TIME:";(TIME-T%)
  470
  480
  490

Here is a break down of performance:

And on BeeB:

Float vs Int is amazing. Just a simple change of adding a % is great. The NEXT is a no brainer.

The check by const vs var is a smaller benefit but if you do this lots in your program then why not?

So that’s it for a bit but tune in next time for more program stuff…

Check it out on YouTube: