100 ; REM PROG NAME IS 'BENCHMARKS' 24 JUN '87
110 ;
120 PEEK $FFFA01,M%:IF M%>127 THEN COLOR%=1
130 CLS:VTAB 4:PRINT " TAKE YOUR CHOICE:":PRINT
140 FOR I%=1 TO 6:PRINT I%;"= LDW BENCHMARK #";I%:NEXT I%
150 PRINT " 7 = CIRCLE BENCHMARK"
160 PRINT " 8 = BENCHMARK COMMENTARY":PRINT
170 PRINT "INPUT YOUR CHOICE (1-8) ";:INPUT N%
180 ON N% GOTO B1,B2,B3,B4,B5,B6,B7,200
190 GOTO 130
200 CLS:RESTORE:N%=12:GOSUB FRAME:GOSUB FRAME21:GOSUB FRAME21
210 GOSUB FRAME21:GOSUB FRAME21:N%=13:GOSUB FRAME:GOSUB FRAME21:GOTO 130
220 ;
230  "FRAME21"
240 N%=21
250 ;
260  "FRAME"
270 CLS:PRINT:FOR I%=1 TO N%:READ A$:PRINT A$:NEXT I%
280 ;
290  "MORE"
300 PRINT:PRINT " M=MORE, Q=QUIT:  YOUR CHOICE ?";
310 INKEY Z$:IF LEN(Z$)<>1 GOTO 310
320 IF Z$="Q" THEN END ELSE IF Z$="q" THEN END
330 IF Z$="M" THEN RETURN ELSE IF Z$="m" THEN RETURN ELSE GOTO 310
340 ;
350 DATA " WARNING NUMBER 1:  THERE ARE LIES, damned LIES, AND THERE ARE BENCHMARKS !"," "
360 DATA " WARNING NUMBER 2:  YOU SHOULD NOT TRUST anybody's BENCHMARKS, INCLUDING OURS."
370 DATA " THE USE OF your INDEPENDENT JUDGEMENT IS ABSOLUTELY ESSENTIAL !"," "," "
380 DATA " YOU SEE, ALMOST ANY BASIC IS GOOD AT something!  THE SECRET TO WINNING THE"
390 DATA " BENCHMARK WARS IS TO MAKE SURE THE BENCHMARKS INCLUDE LOTS OF EXAMPLES OF THE"
400 DATA " THINGS your BASIC IS GOOD AT, AND TO EXCLUDE THE THINGS your BASIC IS not SO"
410 DATA " GOOD AT.  SIMPLE, YES ?"," "," "
420 ;
430 DATA " WELL, MAYBE NOT SO SIMPLE.  HERE ARE SOME OF THE COMMON PLOYS INTENDED TO"
440 DATA " FOOL YOU ABOUT WHO IS FAST AND WHO IS SLOW:"," "
450 DATA " TAKE THE FOLLOWING LINE:"
460 DATA "                          500 Z%=2/5*17+77/3"," "
470 DATA " IF YOUR GLOBAL COMPILER (SUCH AS MOST 'C's AND THE LDW BASIC COMPILER) CAN"
480 DATA " OPTIMIZE THAT TO:"
490 DATA "                          500 Z%=(an integer constant)"," "
500 DATA " THEN CLAIM THAT AS A LEGITIMATE BENCHMARK, AS LDW DOES IN THEIR AD.  IF your"
510 DATA " BASIC DOESN'T DO GLOBAL OPTIMIZATION (AS our DBASIC DOESN'T), CLAIM (AS we DO)"
520 DATA " THAT ONLY AN IDIOT WOULD WRITE SUCH A PROGRAM LINE !"," "
530 DATA " SOME FLOATING POINT PACKAGES DO HAVE (PERHAPS OPTIONAL) DOUBLE-PRECISION BUT"
540 DATA " JUST FOR THE BASIC +,-,*,/.  LOGS, SINES, ETC ARE ONLY CALCULATED TO 4-BYTE"
550 DATA " ACCURACY.  IF YOUR PACKAGE IS LIKE THAT, NEVER ADMIT IT."," "
560 DATA " ON THE OTHER HAND, IF ALL YOUR TRANSCENDENTAL FUNCTIONS ARE CALCULATED USING"
570 DATA " DOUBLE PRECISION, AS OURS ARE, BRAG ABOUT IT CONSTANTLY, AS WE DO."," "
580 ;
590 DATA " BENCHMARKING TWO DIFFERENT LANGUAGES IS EVEN MORE INTERESTING.  C ENTHUSIASTS"
600 DATA " WILL TELL YOU THAT C IS VASTLY SUPERIOR TO (UGH) BASIC, ESPECIALLY WHERE"
610 DATA " PERFORMANCE IS CONCERNED.  WHAT A BUNCH OF BALONEY !"," "
620 DATA " THE FACT IS, C IS ABSOLUTELY LOUSY AT FLOATING POINT PERFORMANCE !  THE"
630 DATA " LANGUAGE SPECIFICATION requires THAT SINGLE PRECISION FP NUMBERS BE CONVERTED"
640 DATA " TO DOUBLE PRECISION BEFORE PERFORMING A MATH OPERATION, AND THEN THAT THE"
650 DATA " DOUBLE PRECISION RESULT BE CONVERTED BACK TO SINGLE PRECISION.  ADD THAT TO"
660 DATA " THE FACT THAT MOST C VENDORS DON'T SEEM TO UNDERSTAND FLOATING POINT, AND YOU"
670 DATA " GET THE UTTERLY PREDICTABLE RESULT:  C FLOATING PERFORMANCE IS AN UTTER pig !"," "
680 DATA " THINK NOT ?  THEN WHY DO WE WHIP MEGAMAX C BY A FACTOR OF 6, AND MARK WILLIAMS"
690 DATA " C BY A FACTOR OF 4 IN THE THIRD LDW BENCHMARK, EVEN THOUGH ALL OF OUR FP"
700 DATA " CALCULATIONS ARE DONE IN DOUBLE PRECISION, AND EVEN THOUGH OUR LANGUAGE IS"
710 DATA " INTERACTIVE AND THEIRS IS A GLOBALLY OPTIMIZED COMPILER ?"," "
720 DATA " WAIT, THERE'S MORE !  C IS ALMOST INCAPABLE OF HANDLING STRING DATA !  TAKE"
730 DATA " ANY BASIC MANUAL - OURS FOR INSTANCE - AND ASK A C ENTHUSIAST HOW TO DO THE"
740 DATA " VARIOUS STRING OPERATIONS WHICH ARE INCLUDED AS HIGH-LEVEL CONSTRUCTS ?  THAT"
750 DATA " C ENTHUSIAST IS GOING TO TRY TO SWITCH THE CONVERSATION TO INTEGERS real FAST"
760 DATA " BECAUSE HE (SHE) knows THAT C HAS ALMOST NO BUILT-IN STRING OPERATIONS !"
770 ;
780 DATA " THERE'S MORE YET !  SOME PROGRAMS ARE DISK INTENSIVE.  WELL, OUR BASIC AUTO-"
790 DATA " MATICALLY OUTRUNS ANY C PROGRAM IN DISK ACCESS BECAUSE THEY USE WONDERFUL TOS"
800 DATA " AND WE DON'T !"," "
810 DATA " WELL, SURELY C DOES BETTER AT TASKS SUCH AS PRINTING TEXT TO THE SCREEN, YOU"
820 DATA " ASK ?  WRONG !  ONCE AGAIN, DBASIC WHIPS MEGAMAX C BY A FACTOR OF 6 AND MARK"
830 DATA " WILLIAMS C BY A FACTOR OF 4 !"," "
840 DATA " WHAT HAPPENED TO THE MYTH OF C SUPERIORITY OVER INTERACTIVE BASIC ?  WELL, IF"
850 DATA " YOU REPEAT A LIE OFTEN ENOUGH, A LOT OF PEOPLE WILL BELIEVE IT."," "
860 DATA " NATURALLY, C (LIKE ALL LANGUAGES) HAS something IT IS GOOD AT, AND THAT SOME-"
870 DATA " THING IS INTEGER ARITHMETIC AND SIMPLE INTEGER LOGICAL CONSTRUCTS, SUCH AS"
880 DATA " EMPTY FOR-NEXT LOOPS.  PERIOD.  TO GET AT THIS SUPERIOR PERFORMANCE IN A"
890 DATA " LIMITED AREA, YOU HAVE TO PUT UP WITH THE EDIT-COMPILE-LINK-DEBUG-REEDIT-"
900 DATA " RECOMPILE-RELINK- ETC. BS WHICH IS BELOVED OF ALL COMPILER FANS.  OH, YES, WE"
910 DATA " ALMOST FORGOT.  AFTER YOU WRITE YOUR CHECKBOOK-BALANCING PROGRAM IN C, YOU CAN"
920 DATA " PORT IT TO THE SINCLAIR ZX-81 AND THE CRAY-2, BECAUSE C'S A PORTABLE LANGUAGE."," "
930 DATA " WE'RE SURE ALL YOU ST OWNERS LOSE SLEEP EVERY NIGHT BECAUSE YOUR BASIC"
940 DATA " PROGRAMS CAN'T BE PORTED TO THE ZX-81 AND THE CRAY-2."
950 ;
960 DATA " THE THING TO REMEMBER IS THAT EVERYBODY LIES, EXAGGERATES, AND MISLEADS WHEN"
970 DATA " IT COMES TO BENCHMARKS...  INCLUDING US.  WHAT YOU HAVE TO DO IS SIT BACK AND"
980 DATA " LOOK AT THE OVERALL PERFORMANCE OF A LANGUAGE, BECAUSE YOU CAN DEPEND ON THE"
990 DATA " LANGUAGE VENDOR TO PRESENT ONLY THOSE THINGS HIS (HER) LANGUAGE IS GOOD AT."," "
1000 DATA " THERE ARE THREE MAJOR DATA TYPES:  STRING, INTEGER, AND FLOATING POINT."
1010 DATA " SEE HOW WELL THE LANGUAGE WORKS WITH ALL THREE.  HOW FAST IS THE DISK ACCESS ?"
1020 DATA " HOW FAST ARE THE GRAPHICS COMMANDS (CIRCLE DRAWING, FOR INSTANCE) ?  HOW FAST"
1030 DATA " DOES THE LANGUAGE PRINT TEXT TO THE SCREEN ?  IS THE FLOATING POINT ACCURATE"
1040 DATA " AS WELL AS FAST ?  WHEN A LANGUAGE VENDOR WON'T DISCUSS ONE OF THESE, YOU CAN"
1050 DATA " BET THERE ARE SOME PROBLEMS IN THAT AREA."," "
1060 DATA " WE HAVE JUST TOLD YOU THAT ALL LANGUAGE VENDORS LIE.  WE'RE A LANGUAGE VENDOR."
1070 DATA " DO WE LIE ?  OF COURSE !  WE'LL TELL YOU WITH OUR BARE FACE HANGING OUT THAT"
1080 DATA " OUR DOUBLE-PRECISION FLOATING POINT MATH AND TRANSCENDENTALS ARE BETTER THAN"
1090 DATA " OTHER FOLKS', EVEN THOUGH SOME OF THOSE OTHER FOLK USE SINGLE IMPRECISION AND"
1100 DATA " HENCE RUN FASTER THAN US.  IS THAT LYING ?  IT IS IF WHAT YOU WANT TO DO IS"
1110 DATA " SHOOT ROCKS !  IF THE RESULT OF A CALCULATION IS WHETHER YOU HIT ONE OF THOSE"
1120 DATA " ALIEN MARTIAN ROCKS WHICH ARE INVADING OUR GALAXY, who cares WHETHER THE"
1130 DATA " RESULT IS ACCURATE OR NOT ?  OUR ASSERTION THAT OUR FLOATING POINT PACKAGE IS"
1140 DATA " SUPERIOR IS, UNDER THIS CIRCUMSTANCE, A LIE."
1150 ;
1160 DATA " FOLLOWING IS A SUITE OF BENCHMARKS.  THE FIRST SIX BENCHMARKS ARE THOSE"
1170 DATA " LISTED IN AN AD BY LDW FOR LDW COMPILED BASIC, WHICH (FOR INSTANCE) RAN IN"
1180 DATA " ST APPLICATIONS MAGAZINE, MAY '87, PAGE 45."," "
1190 DATA " THE TIMINGS REPORTED FOR THOSE SIX BENCHMARKS WERE ALL MEASURED BY LDW, NOT BY"
1200 DATA " US, EXCEPT FOR THE DBASIC TIMINGS."," "
1210 DATA " ADDITIONAL BENCHMARKS HAVE BEEN ADDED, AND WE HAVE ADDED OUR COMMENTS TO THE"
1220 DATA " END OF SOME OF THE BENCHMARKS."," "," "
1230 DATA " BUT FIRST, THE RESULTS:"," "
1240 DATA " BENCHMARKS:  1)  1M EMPTY FOR-NEXT LOOPS           * = INTERACTIVE BASIC"
1250 DATA "              2)  INTEGER CALCULATIONS             ** = COMPILED BASIC"
1260 DATA "              3)  FLOATING POINT BENCHMARK        *** = COMPILED C"
1270 DATA "              4)  BYTE CALC BENCHMARK"
1280 DATA "              5)  BYTE SIEVE SIZE 7000"
1290 DATA "              6)  SCREEN OUTPUT (50 * 20 LINES OF 70 CHARS)"," "
1300 DATA " RESULTS:          1        2      3       4       5        6"," "
1310 DATA " DBASIC    *     17.2     48.8    9.8     3.5      .80     9.2"
1320 DATA " GFA       *     48.1    527     10.2     6.0    14.0     23.3"
1330 DATA " FAST      *     66.0    526      6.0     7.2    16.0    256.0"
1340 DATA " NEW ST    *    303.0   1100     15.5    16.3    38.3    226.6"," "
1350 DATA " GFA       **    17.1    168.2    8.7     3.5     1.3     21.9"
1360 DATA " LDW       **     6.7      4.3    3.5     2.8     1.8     13.9"
1370 DATA " PHILON    **    12.2    111     30.2     8.2     1.5     58.2"
1380 DATA " SOFTWORKS **   379     2542    150      22      33.6     62.1"," "
1390 DATA " MEGAMAX   ***    5.7      6.1   58.8    11.9      .46    63.0"
1400 DATA " MARK WILL ***    6.7      6.3   37.2    10.4      .48    42.7"," "
1410 ;
1420  "B1"
1430 ;
1440 CLS:PRINT:PRINT " PERFORMING A MILLION EMPTY FOR-NEXT LOOPS...  WHOOPEE !"
1450 PRINT:START TIMER:FOR I%=1 TO 1000:FOR J%=1 TO 1000:NEXT J%:NEXT I%
1460 PRINT " TIME = ";TIMER(0);"SECONDS":PRINT
1470 PRINT " THIS BENCHMARK MEASURES EMPTY FOR-NEXT LOOP PERFORMANCE... NOT A TERRIFICALLY"
1480 PRINT " USEFUL TYPE OF TASK.  WE BEAT THE OTHER INTERACTIVE BASICS, OF COURSE, BUT A"
1490 PRINT " COMPILED LANGUAGE CAN USE GLOBAL OPTIMIZATION TO TURN THE 'NEXT' STATEMENT"
1500 PRINT " INTO A SIMPLE MACHINE-LANGUAGE DECREMENT-AND-BRANCH, AND SO BEAT US BY 3-1.":END
1510 ;
1520  "B2"
1530 ;
1540 CLS:PRINT:PRINT " PERFORMING LOTS OF INTEGER CALCS, MOSTLY WITH CONSTANTS."
1550 PRINT:START TIMER
1560 FOR J%=1 TO 10
1570 FOR I%=1 TO 30000
1580 Z%=2/5+3*2+I%
1590 Z%=2*3*5
1600 Z%=2+3+4+5
1610 Z%=Z%+Z%
1620 NEXT I%:NEXT J%
1630 PRINT " TIME =";TIMER(0);"SECONDS":PRINT
1640 PRINT " THIS BENCHMARK INVOLVES DOING A LOT OF CALCULATIONS WITH INTEGER CONSTANTS,"
1650 PRINT " SUCH AS:   1590 Z%=2*3*5":PRINT
1660 PRINT " APPARENTLY SOME GLOBALLY OPTIMIZED COMPILED LANGUAGES ARE CAPABLE OF TURNING"
1670 PRINT " THAT INTO: 1590 Z%=30":PRINT
1680 PRINT " WHICH DEFINITELY CUTS THE RUN-TIME OVERHEAD.  THE GOOD NEWS IS THAT WE BEAT"
1690 PRINT " ALL THE OTHER INTERACTIVE BASICS BY MORE THAN A FACTOR OF 10.":PRINT
1700 PRINT " THE BAD NEWS IS, THAT SORT OF OPTIMIZATION NEVER OCCURED TO US WHEN WE WERE"
1710 PRINT " DESIGNING DBASIC'S PEEP-HOLE OPTIMIZATION (WHICH WE CALL 'TEMPLATE"
1720 PRINT " COMPILATION'), SO (SOME) COMPILERS CAN, AND DO, BEAT US AT THIS BENCHMARK.":PRINT
1730 PRINT " IF YOU WANT TO WRITE PROGRAMS WHICH DO A LOT OF ARITHMETIC WITH CONSTANTS, YOU"
1740 PRINT " WILL BE BETTER OFF USING A COMPILER INSTEAD OF DBASIC.":END
1750 ;
1760  "B3"
1770 ;
1780 CLS:PRINT:PRINT " PERFORMING LOTS OF TRANSCENDENTAL CALCULATIONS (LOGs, SINs, ETC).":PRINT
1790 START TIMER
1800 X=1
1810 FOR I%=1 TO 1000
1820 A=SQR(X):A=LOG(X)
1830 A=LOG10(X):A=EXP(X)
1840 A=SIN(X):A=COS(X)
1850 A=TAN(X):A=ATN(X)
1860 NEXT I%
1870 PRINT " TIME =";TIMER(0);"SECONDS":PRINT
1880 PRINT " THE PROBLEM WITH THIS BENCHMARK IS THAT IT JUST MEASURES TIME, NOT ACCURACY."
1890 PRINT " OUR BASIC REALLY OUGHT TO GET CREDIT FOR PERFORMING THESE CALCULATIONS IN"
1900 PRINT " DOUBLE PRECISION INSTEAD OF THE SINGLE IMPRECISION USED BY MOST OF THE OTHER"
1910 PRINT " GUYS.  STILL, WE WHIP INTERACTIVE GFA (WHICH USES 1 1/2 PRECISION) AND WE BEAT"
1920 PRINT " BOTH COMPILED Cs BADLY (MEGAMAX BY A FACTOR OF 6).":END
1930 ;
1940  "B4"
1950 ;
1960 ; CALCULATION BENCHMARK, BYTE MAY '84 P.282
1970 ;
1980 CLS:PRINT:PRINT " PERFORMING LOTS OF FLOATING-POINT MATH - MULTIPLYS AND DIVIDES":PRINT
1990 START TIMER:N=5000:A=2.71898:B=3.14159:C=1
2000 FOR I=1 TO N:C=C*A:C=C*B:C=C/A:C=C/B:NEXT I
2010 ERR=1-C:T=TIMER(0):PRINT " ERROR=";ERR
2020 PRINT " TIME  =";T;"SECONDS":PRINT
2030 PRINT " WE BEAT EVERYBODY BUT LDW COMPILED BASIC ON THIS BENCHMARK, EVEN THOUGH MOST"
2040 PRINT " OF THE COMPETITION USES SINGLE IMPRECISION WHILE WE USE DOUBLE PRECISION."
2050 PRINT " BUT LDW'S SINGLE IMPRECISION MATH BEATS OUR DOUBLE PRECISION BY 20% (SIGH).":PRINT
2060 PRINT " DON'T WE GET ANY CREDIT FOR HAVING ACCURATE RESULTS ??":END
2070 ;
2080  "B5"
2090 ;
2100 ; BYTE SIEVE, SIZE 7000, TEN ITERATIONS
2110 ;
2120 CLS:VTAB 10:PRINT " CALCULATING 10 ITERATIONS OF THE BYTE SIEVE BENCHMARK"
2130 VTAB 12:START TIMER:DIM FLAGS%[7002]:PRINT " SIZE 7000, 10 ITERATIONS"
2140 FOR M%=1 TO 10:COUNT%=0:INIT FLAGS%[]=1
2150 FOR I%=1 TO 7001:IF FLAGS%[I%]=0 THEN NEXT I%:GOTO 2190
2160 PRIME%=I%+I%+3:K%=I%+PRIME%
2170 IF K%>7001 THEN COUNT%=COUNT%+1:NEXT I%:GOTO 2190
2180 FLAGS%[K%]=0:K%=K%+PRIME%:GOTO 2170
2190 NEXT M%:T=TIMER(0):PRINT COUNT%;" PRIMES FOUND"
2200 PRINT " ELAPSED TIME (10 ITERATIONS) =";T;"SECONDS"
2210 PRINT " TIME PER ITERATION =";T/10;"SECONDS":PRINT
2220 PRINT " THE BYTE 'SIEVE OF ERASTOSTHENES' IS AN EXCELLENT ALL-AROUND TEST OF INTEGER"
2230 PRINT " PERFORMANCE.  IT EXERCISES ARRAY INITIALIZATION, ARRAY ELEMENT LOOKUP, LOGICAL"
2240 PRINT " TESTS AND BRANCHES, AND FOR-NEXT LOOPS THAT aren't EMPTY.  WE WHIP ORIGINAL"
2250 PRINT " ST BASIC ON THIS ONE BY A FACTOR OF MORE THAN 100;  WE BEAT INTERACTIVE GFA"
2260 PRINT " BASIC BY A FACTOR OF 17, AND WE ARE EVEN SIGNIFICANTLY FASTER THAN compiled"
2270 PRINT " GFA OR LDW BASICS.  BOTH MEGAMAX AND MK WILLIAMS COMPILED Cs BEAT US THOUGH"
2280 PRINT " (BUT BY LESS THAN A FACTOR OF 2).  THAT'S A GOOD THING;  WE WERE BEGINNING TO"
2290 PRINT " WONDER IF COMPILED Cs WERE GOOD FOR ANYTHING !":PRINT
2300 PRINT " UH - AREN'T INTERACTIVE BASICS (LIKE DBASIC) SUPPOSED TO BE SLOW ??":END
2310 ;
2320  "B6"
2330 ;
2340 ; SCREEN OUTPUT TEST, 1000 LINES OF 70 CHARS
2350 ;
2360 STR$="0123456789012345678901234567890123456789012345678901234567890123456789"
2370 CLS:START TIMER:FOR I%=1 TO 50:FOR L%=1 TO 20:PRINT STR$:NEXT L%
2380 HOME:NEXT I%:VTAB 21:PRINT " TIME = ";TIMER(0);"SECONDS"
2390 PRINT:PRINT " WE BEAT everybody ON THIS ONE !!  FOR INSTANCE, MEGAMAX C IS 6 TIMES SLOWER"
2400 PRINT " THAN US ON THIS BENCHMARK !":PRINT
2410 PRINT " WE'RE CONFUSED - AREN'T COMPILED Cs SUPPOSED TO BE A LOT FASTER THAN"
2420 PRINT " INTERACTIVE BASICS ??":END
2430 ;
2440  "B7"
2450 ;
2460 IF COLOR%=1 THEN V%=100 ELSE V%=200:; ADJUST FOR MONOCHROME OR COLOR
2470 CLS:START TIMER:FOR I%=1 TO 5
2480 FOR R%=1 TO V%:CIRSET (320,V%),R%:NEXT R%
2490 FOR R%=1 TO V%:CIRCLR (320,V%),R%:NEXT R%
2500 NEXT I%:VTAB 4:PRINT " TIME =";TIMER(0);"SECONDS":PRINT
2510 PRINT " TRY THIS ONE ON ANOTHER BASIC OR C OR WHATEVER - WE DARE Y0U !"
