B e n c h m a r k i n g   O n

N e t a d e l i c a



In comp.lang.basic.misc in March 1997, I posted a benchmarking program to test 19 elements of a BASIC language. As I didn't have any compilers, only the QBASIC interpreter, the aim was to find out which BASICs did better or worse in certain areas, with the specific aim I had of finding which compiler I should buy.

A few people posted their results with various languages, but it was soon apparent that only two or more languages tested on the same platform gave a useful measure of performance. Two people did tests of two or more languages, Marc van den Dikkenberg and myself. Those languages were QBASIC, QuickBasic 4.5, and dialects of PowerBASIC (PB3.2, the evaluation version of PB3.0, and PB2.1).

I gathered the results and did comparisons of different combinations of languages. The ultra-brief summary was that PB is the fastest BASIC overall, but is either slower or no faster than any other language (including QBASIC) at string handling and graphics primitives.

The full comparisons are below. Basically, each chart line shows how many times faster the second language performed the test as a multiple of the first. For example, the bars in the "QB45 / PB3.2" chart show how fast PB3.2 performed each test as a multiple of how fast QuickBasic 4.5 performed it. Marc van den Dikkenberg used a P133, I used a P166.

 
QBASIC1.1 / PB3.2 (Dikkenberg)
Multiplication, single precision (150k) 107.5 |||||||||||||||||||||||||||||||||||||||||||||||||||||
Bubble sort, single precision (350 elements) 82.4 |||||||||||||||||||||||||||||||||||||||||
Empty loop, double precision, step=1 (600k) 66.3 |||||||||||||||||||||||||||||||||
Empty loop, single precision, step=1 (600k) 64.7 ||||||||||||||||||||||||||||||||
Empty loop, double precision, step=.137 (10k) 57.5 ||||||||||||||||||||||||||||
Empty loop, single precision, step=.137 (10k) 55.8 |||||||||||||||||||||||||||
Trigonometry assignation, single precision (31.4k) 51.4 |||||||||||||||||||||||||
Division, integer, using / (300k) 48.6 ||||||||||||||||||||||||
Division, single precision (300k) 47.0 |||||||||||||||||||||||
Bubble sort, integer (1500 elements) 25.7 ||||||||||||
Empty loop, integer, step=1 (12m) 20.2 ||||||||||
Multiplication, integer (4m) 14.4 |||||||
Empty loop, long integer, step=1 (12m) 8.3 ||||
Division, integer, using \ (3m) 6.8 |||
Graphics, circles (20k) 1.7
Graphics, put pixels 1.6
Graphics, rectangles (60k) 0.8
String (re)assignation and concatenation (20k) 0.8
Graphics, lines (35k) 0.6
 
QB45 / PB3.2 (Dikkenberg)
Empty loop, double precision, step=1 (600k) 21.8 ||||||||||
Empty loop, single precision, step=1 (600k) 21.2 ||||||||||
Bubble sort, single precision (350 elements) 21.0 ||||||||||
Multiplication, single precision (150k) 20.5 ||||||||||
Empty loop, single precision, step=.137 (10k) 18.5 |||||||||
Empty loop, double precision, step=.137 (10k) 18.5 |||||||||
Division, integer, using / (300k) 6.8 |||
Division, single precision (300k) 6.6 |||
Trigonometry assignation, single precision (31.4k) 6.0 |||
Empty loop, long integer, step=1 (12m) 2.1 |
Graphics, circles (20k) 1.7
Multiplication, integer (4m) 1.0
Graphics, put pixels 1.0
Division, integer, using \ (3m) 0.9
Graphics, rectangles (60k) 0.8
String (re)assignation and concatenation (20k) 0.8
Graphics, lines (35k) 0.6
Bubble sort, integer (1500 elements) 0.5
Empty loop, integer, step=1 (12m) 0.5
 
QBASIC1.1 / PB3.2 (me)
Bubble sort, single precision (350 elements) 105.5 ||||||||||||||||||||||||||||||||||||||||||||||||||||
Multiplication, single precision (150k) 91.0 |||||||||||||||||||||||||||||||||||||||||||||
Empty loop, double precision, step=1 (600k) 74.6 |||||||||||||||||||||||||||||||||||||
Empty loop, single precision, step=1 (600k) 72.0 |||||||||||||||||||||||||||||||||||
Trigonometry assignation, single precision (31.4k) 69.0 ||||||||||||||||||||||||||||||||||
Empty loop, double precision, step=.137 (10k) 64.3 ||||||||||||||||||||||||||||||||
Empty loop, single precision, step=.137 (10k) 61.0 ||||||||||||||||||||||||||||||
Division, integer, using / (300k) 51.8 |||||||||||||||||||||||||
Division, single precision (300k) 49.0 ||||||||||||||||||||||||
Bubble sort, integer (1500 elements) 24.7 ||||||||||||
Empty loop, integer, step=1 (12m) 19.8 |||||||||
Multiplication, integer (4m) 12.4 ||||||
Empty loop, long integer, step=1 (12m) 8.3 ||||
Division, integer, using \ (3m) 6.0 |||
Graphics, circles (20k) 1.7
Graphics, put pixels 1.6
String (re)assignation and concatenation (20k) 0.9
Graphics, rectangles (60k) 0.8
Graphics, lines (35k) 0.6
 
QBASIC1.1 / TryPB3 (me)
Multiplication, single precision (150k) 182.1 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bubble sort, single precision (350 elements) 105.5 ||||||||||||||||||||||||||||||||||||||||||||||||||||
Empty loop, double precision, step=1 (600k) 74.6 |||||||||||||||||||||||||||||||||||||
Empty loop, single precision, step=1 (600k) 72.0 |||||||||||||||||||||||||||||||||||
Empty loop, double precision, step=.137 (10k) 64.3 ||||||||||||||||||||||||||||||||
Empty loop, single precision, step=.137 (10k) 61.0 ||||||||||||||||||||||||||||||
Trigonometry assignation, single precision (31.4k) 51.8 |||||||||||||||||||||||||
Division, integer, using / (300k) 51.8 |||||||||||||||||||||||||
Division, single precision (300k) 49.0 ||||||||||||||||||||||||
Bubble sort, integer (1500 elements) 24.7 ||||||||||||
Empty loop, integer, step=1 (12m) 19.8 |||||||||
Multiplication, integer (4m) 13.1 ||||||
Empty loop, long integer, step=1 (12m) 8.7 ||||
Division, integer, using \ (3m) 6.0 |||
Graphics, circles (20k) 1.7
Graphics, put pixels 1.6
String (re)assignation and concatenation (20k) 0.9
Graphics, rectangles (60k) 0.8
Graphics, lines (35k) 0.6
 
QBASIC1.1 / FirstBasic (me)
Multiplication, single precision (150k) 60.7 ||||||||||||||||||||||||||||||
Empty loop, single precision, step=1 (600k) 54.0 ||||||||||||||||||||||||||
Trigonometry assignation, single precision (31.4k) 51.8 |||||||||||||||||||||||||
Division, integer, using / (300k) 51.8 |||||||||||||||||||||||||
Empty loop, double precision, step=1 (600k) 44.8 ||||||||||||||||||||||
Division, single precision (300k) 39.2 |||||||||||||||||||
Empty loop, double precision, step=.137 (10k) 38.6 |||||||||||||||||||
Empty loop, single precision, step=.137 (10k) 36.6 ||||||||||||||||||
Bubble sort, single precision (350 elements) 35.2 |||||||||||||||||
Empty loop, integer, step=1 (12m) 11.3 |||||
Multiplication, integer (4m) 10.1 |||||
Division, integer, using \ (3m) 6.9 |||
Empty loop, long integer, step=1 (12m) 5.5 ||
Bubble sort, integer (1500 elements) 2.8 |
Graphics, circles (20k) 1.7
Graphics, put pixels 1.6
String (re)assignation and concatenation (20k) 0.9
Graphics, rectangles (60k) 0.8
Graphics, lines (35k) 0.6
 
FirstBasic / TryPB3 (me)
Bubble sort, integer (1500 elements) 8.8 ||||
Bubble sort, single precision (350 elements) 3.0 |
Multiplication, single precision (150k) 3.0 |
Empty loop, integer, step=1 (12m) 1.7
Empty loop, double precision, step=.137 (10k) 1.7
Empty loop, double precision, step=1 (600k) 1.7
Empty loop, single precision, step=.137 (10k) 1.7
Empty loop, long integer, step=1 (12m) 1.6
Empty loop, single precision, step=1 (600k) 1.3
Multiplication, integer (4m) 1.3
Division, single precision (300k) 1.3
Graphics, lines (35k) 1.0
Graphics, put pixels 1.0
Graphics, rectangles (60k) 1.0
Graphics, circles (20k) 1.0
Division, integer, using / (300k) 1.0
Trigonometry assignation, single precision (31.4k) 1.0
String (re)assignation and concatenation (20k) 1.0
Division, integer, using \ (3m) 0.9



Back to the Netadelica home page