Anzeigen des Gesamtinhalts (oder Logo links anklicken) oder des Impressums.

Dies ist eine alte Version des Dokuments!


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
\   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
 
\ Collatz-Schritt:
: cn+1 		( cn -- cm )
  2 /mod swap			
  if 3 * 2 + endif
;
 
\ Collatz-Folge drucken
: coll. 	( cn -- )
  begin dup 1 > while
  cn+1 dup .
  repeat
  drop		( always 1 )
;
 
\ Collatz-Folge zaehlen
: ccnt 		( cn -- cnt)
  0 swap 	( cnt cn )
  begin dup 1 > while
  cn+1 swap 1+ swap
  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 .	
." = 194 ! "
 
: bench
  99 0 do 32101 cmax drop loop
;
 
bench

Auf einem Fairphone 2 (Qualcomm MSM8974PRO-AA) ist die Zeit mit gforth etwa 27 sec, auf einem Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz unter Debian Linux mit gforth sind es 8.7 sec.

Allerdings ist mit den angegebenen Ausgangswerten kein 16-Bit FORTH möglich, da die Folgenglieder größer als 32767 werden.

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.


Übersetzungen:
Anmelden