RunCPM Speed-Vergleich auf verschiedenen Plattformen

  • ok, weiterer versuch: wieso nicht wie schon zuvor bei xlinx das gleiche auch für Y*0.08333 machen. auch hier kann man ein array vorab ausrechnen ...


    ich verstehe die Bemerkung nciht:

    Evtl. sieht das aber auf einer kleinen Hardware ohne Floatingpoint doch anders aus.

    Einmal editiert, zuletzt von DoPe ()

  • ich verstehe die Bemerkung nciht:


    Das sollte nur heißen, daß ich das hier auf einem mehrere Gigahertz Quadcore mal allen möglichen Hardwarecoprozessoren inklusive ausprobiert habe und dann eben einfach 5000 Durchläufe gemacht habe, um überhaupt kleine Unterschiede zu sehen. Wenn man das nun aber auf einem Gerät laufen läßt, was keine Floating Point Hardware hat, passiert da ja nochmal was ganz anderes, weil das dort dann ja langsamst emuliert wird (6502 Pet, Z80 CPC oder sowas).



    Zu dem Y*0.08333 : das läuft ja wohl jedesmal nur einmal durch die Schleife, daher bringt das wohl nix da ein Array zu benutzen. Man macht damit dann nichts gut, wenn bereits gilt: Es vor die Schleife zu stellen, der Vorschlag von funkenzupfer, sollte dagegen schon was bringen. Vielleicht ist das ja sogar der Haupteffekt der die 14 Sekunden Beschleunigung hauptsächlich ausmacht.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

    Einmal editiert, zuletzt von ThoralfAsmussen ()

    • Offizieller Beitrag

    wieso nicht wie schon zuvor bei xlinx das gleiche auch für Y*0.08333 machen. auch hier kann man ein array vorab ausrechnen ...

    Weil jedes Y nur ein mal vorkommt.

    Bei X werden alle Werte Y mal durchlaufen.

  • Ja, richtig.

    Insgesamt ist es aber sehr verwunderlich wo bascom die Zeit gewinnt.

    Könnte es nicht sein, daß bascom für die ausgaben "write( ...)" den bios int 10H benutzt?

    wenn das so ist, dann wundert es mich nicht, denn der hier verwendete turbo3 compiler ist eine compiler für ein ANSI-Terminal. D.h., er ruft den dos int 21H auf, der die Ausgabe auf ANSI ESCacpe Sequenzen hin überprüft. Das kostet enorm viel Zeit .... habe eine NCR DMV mit Turbo3 für ANSI-Terminal als auch (gepatched damit er läuft) den Turbo3 für PC-DOS (IBM). Der Unterschied in der Bidlschirmausgabe ist enorm. Ob das allerdings den großen Zeitvorsprung des bascom compilers wettmachen kann ...

  • Das ist ja generell das große Problem an den Tests. Gerade auch über verschiedene System hinweg. Trotzdem ist es natürlich lustig zu sehen und so bißchen ein Anhaltspunkt ergibt sich schon auch - etwa wenn es 40 sec vs 2:58 min steht.


    Da kann der guidol ja einfach mal die Ausgabe abschalten. Dann klärt sich das ja evtl.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Noch eine Idee:


    die Zeilen:

    POWA:=A*A;

    POWB:=B*B;


    ändern in:

    POWA:=sqr(A);

    POWB:=sqr(B);


    Ich könnte mir vorstellen, daß dies der Schlüssel ist, weil die funktion sqr() "weiß" daß sie 2 mal den gleichen wert vor sich hat, der in Real-Zahlendarstellung vorliegt. D.h., Basis/Hochzahl. Eine derartige Zahl mit sich selbst multiplizieren bedeutet immer, daß man nur die Hochzahlen summieren muß.

    2 Mal editiert, zuletzt von DoPe ()

  • An sich kein großes Wunder, das compiliertes MBASIC schneller ist als Turbo-Pascal:


    MBASIC rechnet mit 32-Bit-Fließkommazahlen, Turbo-Pascal mit 16 Bit mehr.


    Dass MBASIC aber annähernd doppelt so schnell ist, wundert mich schon ein bißchen.

    • Offizieller Beitrag

    Wir sind ja hier im CPM Land unterwegs ....

    Ja, aber auch da gibt es ein BIOS bzw BDOS mit dem man Zeichen ausgeben kann.

    Je nach System muss das BIOS dann auch eine Terminal-Emulation vornehmen oder sendet das Zeichen einfach über eine serielle Schnittstelle raus. Alleine deshalb wird es große Unterschiede bei solchen Benchmarks geben. Selbst wenn ich das gleiche Programm bei gleichem Prozessor und gleicher Taktfrequenz und und und benutze.

    Damals war es wichtiger, das gleiche Programm läuft mit gleichem Ergebnis auf vielen Rechnern. Aber das nur nebenbei.


    Die Benchmarks und deren Ausführungszeiten seh ich Vergleichskriterium auch sehr kritisch. Aber es ist einfach sehr interessant.

    Ich weiss ja auch gerne auf meine eigene Ergebnisse hin. RE: RunCPM Speed-Vergleich auf verschiedenen Plattformen ;)

  • Da kann der guidol ja einfach mal die Ausgabe abschalten. Dann klärt sich das ja evtl.

    Hab ich mal getan, bringt keinen Speedgewinn - beim ESP-C3-32S

    denn - wo ich drueber nachdenke ist mir es klar, dass es nichts bringen kann -

    denn die Ausgabe erfolgt hier ueber die serielle USB-Schnittstelle mit 115.200 Baud :)


    Ich hatte das FRAC2/FRAC3 nochmal ohne Ausgabe compiliert und genau die gleichen Zeiten.


    Bei einem C=128 unter CP/M koennte dies natuerlich GANZ anders aussehen, der mueht sich bei der Ausgabe doch sehr ab ;)

  • Na ja, das testet aber eher die Qualität des Basic Interpreters - und versucht noch nichtmal eine irgendwie geartete Aussage über die "Rechenpower" des Geräts zu finden. Jetzt vom "MATH:" Test ( LET Y=(TAN(ATN(SQR(Y*Y)))+1)/Y ) mal abgesehen. AUßerdem kann man natürlich auch da trefflich diskutieren, was z.B. ein StringRoutinen Test soll, der MID$ nicht benutzt. LEFT$ und RIGHT$ sind ja wohl relativ easy zu machen. Und der "ARRAY:" Test, testet evtl. in erster Linie die Division aus der Funktion von FNM() und dem /3. (habe nur das BBC Basic angeschaut).


    Prinzipiell aber schon eine schöne Idee.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Dass das nur auf BASIC sich bezieht, ist bei "FRACTAL.BAS" doch ähnlich. Da es meist als Hochsprache bei Heimcomputern nur ein BASIC-Interpreter gibt, ist das, wenn nicht Äpfel mit Birnen (Interpreter mit Compiler) verglichen wird, aber trotzdem aussagekräftig.

    Außerdem würde uns keiner daran hindern, da einfach die Tests zu verfeinern/zu ergänzen ;)

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.

  • Für das MBASIC gibt es auch einen Compiler. Allerdings wird ein LINKer dazu gebraucht, im Handbuch ein LINK80.COM. Erzeugt wird eine .REL-File.


    Mittels verschiedener Optionen kann entschieden werden, ob ein BRUN.COM benötigt wird oder nicht.

    basiccompiler.zip


    Problem, das ganze ist für Robotron installiert, also 80*24 auf PC1715 und andere. Das müsste man probieren. Was fehlt ist das BCLOAD.COM.

  • push

    bitte mal probieren

    die Zeilen:

    POWA:=A*A;

    POWB:=B*B;


    ändern in:

    POWA:=sqr(A);

    POWB:=sqr(B);


    wenn die sqr() funktion ordentlich programmiert ist, sollte das ordentlich beschleunigen

  • einsparung von 2 integer additionen sowie einem goto sollte ein bißchen was bringen


  • noch eine ersparnis zum obigen code


    statt:

    T:= POWA - POWB + CA;

    B:= 2 * A*B + CB;

    A:= T;


    geht es kürzer mit:

    B:= 2 * A*B + CB;

    A:= POWA - POWB + CA;


    die variable T ist unnötig.

  • geht es kürzer mit:

    B:= 2 * A*B + CB;

    A:= POWA - POWB + CA;


    die variable T ist unnötig.

    Hmm - auch mit den zusaetzlichen Einsparungen waren es jetzt 43 Sekunden....
    Gegen die 33-35 Sekunden vom BASCOM-compile scheint der Hase woanders im Pfeffer zu liegen...

  • seltsam ... das ist ja langsamer als die 41 die wir schon hatten


    wurden da jetzt alle änderungen vorgenommen, also auch die verlegung der write() anweisung in die innere schleife oder ist das nur das weglassen der variable T ?

  • seltsam ... das ist ja langsamer als die 41 die wir schon hatten


    wurden da jetzt alle änderungen vorgenommen, also auch die verlegung der write() anweisung in die innere schleife oder ist das nur das weglassen der variable T ?

    ich hatte den kompletten Code aus Deinem Beitrag #186 genommen und die Aenderung von #187

  • so, letzter versuch heute abend

    ein bißchen was sollte sich jetzt aber schon bewegen: das auszugebende zeichen wird jetzt vorinitialisiert in einem array.

    dadurch braucht es kein if i > 9 ... sowie kein else und keine indexaditionen mehr.

    damit sollte man jetzt endlich die schallmauer 40 durchbrechen ....


  • so, letzter versuch heute abend

    ein bißchen was sollte sich jetzt aber schon bewegen: das auszugebende zeichen wird jetzt vorinitialisiert in einem array.

    dadurch braucht es kein if i > 9 ... sowie kein else und keine indexaditionen mehr.

    damit sollte man jetzt endlich die schallmauer 40 durchbrechen ....

    Nope :(
    sind immer noch 41-43 Sekunden. Die ASCII-Zeichen haben sich etwas geaendert (Keine grossen A-F mehr) dafuer mehr Satzzeichen etc.

  • Ich habe ein wenig mit den binomischen Formeln herumgespielt, im Versuch eine Multiplikation zu sparen. Leider ohne Erfolg. Es sieht zwar vielversprechend aus mit (A+B)² = A²+B²+2AB und (A+B)(A-B)=A²-B², aber leider bleiben am Ende gleich viele Multiplikationen übrig. Eine Kleinigkeit kann man aber noch optimieren: Für Interpreter und sicher auch alle Pascal Compiler ist T:=A*B; B:=T+T+CB ziemlich sicher etwas schneller als 2*A*B+CB.


    Eine noch kleinere Optimierung könnte ein manuelles Loop-Enrolling der innersten Schleife sein. Zumindest für i < 3, was ja einen ordentlichen Anteil der Ausgabe betrifft. Viel mehr als den "Overhead" der For-Loop und den Array Zugriff beim write() kann man so aber nicht sparen.

  • Zum Fehler bei den ausgegebenen Zeichen:

    es müssen in den beiden initialisierungs fori i:= ... schleifen die beiden werte 48 und 55 vertauscht werden.


    Lauft das benchprogramm eigentlich auf einem Originalrechner oder in einer simulations-maschine?


    Letztlich glaube ich daß tofro Recht hat: der bascom compiler rechnet die real-Zahlen mit 4 Bytes, während turbo3 dies mit 6 Bytes macht. Das könnte den Laufzeitunterschied ausmachen.