wmb@SUN.COM (11/07/89)
Here are both versions of the sieve benchmark:
decimal
8192 constant size
variable flags size allot
\ This is the "standard" sieve benchmark as published in Byte Magazine.
\ The algorithm is wrong in the sense that it gives an incorrect count
\ of the number of primes. That doesn't affect it's usefulness as a
\ benchmark.
\ This benchmark tends to be relatively insensitive to the efficiency
\ of "nesting" (calling a colon definition), since it is implemented
\ almost entirely with very low level words, which are code words in
\ most Forth implementations. This is reasonably fair, however, since
\ studies have shown that in many Forth programs, code words get
\ executed on the order of 8 times more frequently than colon
\ definitions.
\ Times are generally quoted for 10 iterations (use 10-times).
: do-prime ( 16 seconds for 32-bit dtc forth)
flags size 1 fill ( set array )
0 ( 0 count ) size 0
do flags i + c@
if i dup + 3 + dup i +
begin dup size <
while 0 over flags + c! over +
repeat
drop drop 1+
then
loop
. ." primes "
;
: 10-times 10 0 do do-prime loop ;
\ This is the "Colburn Sieve" as published in a letter to the editor
\ of Dr. Dobbs' Journal. It is the same algorithm as the first, but
\ is a better Forth implementation of the algorithm. It uses a
\ DO .. LOOP in the inner loop instead of BEGIN .. WHILE .. REPEAT
\ This version is a more fair comparison of Forth in relation to other
\ languages. For comparisons between different Forth systems, both
\ versions are widely used. It is necessary to state which version
\ you are using in order for your benchmark to be useful.
\ The Colburn Sieve typically runs in about 60% of the time of the
\ Byte sieve.
: do-prime.hi ( 11 seconds for 32-bit dtc forth )
flags size 1 fill ( set array )
0 ( 0 count ) size 0
do flags i + c@
if 3 i + i + dup i + size <
if size flags + over i + flags +
do 0 i c! dup
+loop
then drop 1+ ( bump prime counter)
then
loop
. ." primes "
;
: 10-times.hi 10 0 do do-prime.hi loop ;