Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| forth:rechnervergleiche [2017-10-03 17:01] – created rainer | forth:rechnervergleiche [2017-10-05 19:53] (aktuell) – 16 bit Version rainer | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== xxx ====== | + | ===== Vergleichsprogramme (Benchmark) |
| Zum Vergleich kleiner Rechner ist Forth gut geeignet, da der Implemetaionsaufwand gering ist. | 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:// | Hierzu sind kleine Programme mit üblichem Sprachumfang sinnvoll, wie sie auf [[http:// | ||
| - | Ein weiterer Kandidat ist die Collatz-Folge. | + | Ein weiterer Kandidat ist die Collatz-Folge: |
| + | <code forth collatz.fc> | ||
| + | \ Benchmark mit der Collatz-Funktion | ||
| + | \ | ||
| + | \ Da der zweite Term immer gerade ist, wird | ||
| + | \ | ||
| + | \ 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)/ | ||
| + | \ Diese Version für 16-bit Rechner prüft vor einem Überlauf und bricht die Folge ab: | ||
| + | \ Damit 3*q+2< | ||
| + | |||
| + | \ 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> | ||
