Vergleichsprogramme (Benchmark)
Zum Vergleich kleiner Rechner ist Forth gut geeignet, da der Implemetaionsaufwand gering ist. Hierzu sind kleine Programme mit üblichem Sprachumfang sinnvoll, wie sie auf http://theultimatebenchmark.org/ gezeigt werden.
Ein weiterer Kandidat ist die Collatz-Folge:
- collatz.fc
\ Benchmark mit der Collatz-Funktion V1.1 RG 2017-10-05 \ c[n+1] = if even(c[n]) then c[n]/2 else 3*c[n]+1 fi \ Da der zweite Term immer gerade ist, wird \ c[n+1] = if odd(c[n]) then c[n]/2 else (3*c[n]+1)/2 fi \ Seien r[n] der Rest und q[n] der Quotient von c[n]/2, also c[n] = 2*q[n] + r[n], somit bei r[n] = 1: \ (3*c[n]+1)/2 = 3*q[n] + 2 \ Diese Version für 16-bit Rechner prüft vor einem Überlauf und bricht die Folge ab: \ Damit 3*q+2<32767 ist, muss q<10922 sein. \ Collatz-Schritt. Null wenn Ueberlauf : cn+1 ( cn -- cm ) 2 /mod swap if dup 10922 < ( ueberlauf ? ) if 3 * 2 + else drop 0 endif endif ; \ Collatz-Folge drucken : coll. ( cn -- ) begin dup 1 > while cn+1 dup . repeat drop ( always 1 ) ; \ Collatz-Folge zaehlen. Null wenn Überlauf : ccnt ( cn -- cnt) 0 swap ( cnt cn ) begin dup 1 > while cn+1 dup if swap 1+ swap ( zaehlen ) else drop 0 endif repeat drop ; \ Maximum fuer alle Folgen bis k bestimmen : cmax ( k -- max ) 0 swap ( max k ) begin dup 0> while dup ccnt ( max k cnt ) rot ( k cnt max ) max ( k max ) swap ( max k ) 1 - ( max k-1 ) repeat drop ; 32101 cmax . ." = 126 ! " : bench 99 0 do 32101 cmax drop loop ;
Auf einem Fairphone 2 (Qualcomm MSM8974PRO-AA) ist die Zeit mit gforth etwa 45 sec, auf einem Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz unter Debian Linux mit gforth sind es 14.5 sec.
Mit den angegebenen Ausgangswerten können nicht alle Werte mit 16-Bit FORTH berechnet, da die Folgenglieder größer als 32767 werden. In diesem Fall bricht das obige Programm die Folge ab und zählt sie nicht. Dies ist immer dann der Fall, wenn 3q+2>32767, also q>10921 ist, wenn also die Ausgangzahl ungerade und größer als 21843 ist. Gerade Ausgangszahlen ergeben weniger als 16348, sind also immer möglich. Es reicht nicht, auf negative Resultate zu testen, weil durch die Multiplikation mit 3 positive Resultate entstehen können.