Hallo Besucher, der Thread wurde 8,9k mal aufgerufen und enthält 62 Antworten

letzter Beitrag von BIF am

Schnelle BASIC Versionen auf 65xx/Z80?

  • Ja, es ist schon schneller. Aber 10% finde ich jetzt nicht so viel, dass ich da in Jubel ausbrechen würde. Ich wollte nur darauf hinweisen, dass es eben nicht sooo super ist, wie es immer dargestellt wird. Dafür hat es zum Beispiel keine Garbage Collection aber auch nicht diesen statischen Ansatz vom Atari BASIC, was Strings angeht. D.h. wenn man da nicht drauf achtet, dann müllt es den Speicher mit Strings voll und steigt dann irgendwann mit OOM aus.

    Ja klar, aber was kann man sich schon ehrlich erwarten. Es ist kein Jubel notwendig. Das sind 10 % ja schon super (das war j a nur der Durchschnitt über 9 Programme einer Suite), und das nur bei einer relativ floating-point-lastigen Benchmark-Suite. Egal, was man macht, wenn man einen Funken von Programmierung hat, wird man hier an der Sockelperformence (bei gleicher Präzision) nicht viel unterschiedlich implementieren können, dass mehr als einige Prozentpunkte herausschauen. Die 10 % sind dann im Schnitt nur noch das, was halt mit den Kontrollstrukturen und Variablen (entsprechend ihrem Anteil) herauszuholen kann - und das ist schon wirklich "gut". In gewissen Bereichen, wo etwas nur Kontrollstrukturen gemessen werden sind 40 oder gar 50 % drinnen.

    In anderen Bereichen, wie etwa Grafik hat man im Gegensatz zu FP-Implementierungen noch eher mehr Spielraum, wo man deutlichere Unterschiede erwarten kann, die sogar in "Größenordnungen" gehen können, wenn ich beispielsweise die Performance von Grafikerweiterungen vergleiche.


    Solche Benchmarks hinken dann auch einfach, wenn man mit einer BASIC-Variante Möglichkeiten in die Hand bekommt, die dann den Benchmark nicht mehr vergleichbar machen. Etwa, wenn sich die meisten BASIC-Varianten mit FP-Arithmetik abplagen müssen und BBC-BASIC aber Integer-Arithmetik hat, dann hätte man hier schon wesentliche Verbesserungen, aber im Sinne einer Fairness nicht mehr mit dem Rest vergleichbar. Will damit sagen, dass ein Benchmark diverse Suites, etwa solche, die fixe Programme vorgeben, nur bedingt aussagekräftig ist, was unterschiedliche Dialekte an Leistungsfähigkeit hervorbringen können. Wenn man das breiter anlegt, wie etwa beim Byte Benchmark Eratosthenes Sieve, wo gewissermaßen nur der Algorithmus vorgegeben ist, und quasi egal ist wie das implementiert ist, dann ist das - so finde ich - das wesentlich interessanter.


    So gesehen hängt es ohnehin immer davon ab, welches Problem man hat, ob eine gewisse Eignung dafür vorhanden ist. Ein Implementierung oder Algorithmen müssen sich gegebenenfalls auch darauf ausrichten, wenn man etwa keine dynamische String-Verwaltung hat oder so.

    Eine allgemeingültige Aussage, die sich hier vielleicht die einen oder anderen wünschen, kann man sowieso nicht geben.

  • Ich behaupte mal, dass mindestens 80% aller nicht-mathematischen Basic-Programme mit Integer-Arithmetik auskommen. Vor allem Spiele.

    Deswegen wäre gerade ein Integer-Benchmark sehr aussagekräftig.


    Wenn da auch nur ein paar Prozent rauskommen, dann kann man sich eigentlich den ganzen Aufwand mit der Integer-Arithmetik sparen.


    Leider kommt man mit 16-Bit-Integer mit Vorzeichen nicht sehr weit (-32768 bis +32767). Damit könnte man auf dem PET nicht mal den Bildschirmspeicher adressieren. Spannend wird es ab 24-Bit-Integer. Aber ob das dann noch so viel schneller ist, als FP.

  • Und bei jedem Bildschirmzugriff dann eine Integer -> FP Umwandlung. Und in der POKE -Routine wird dann wieder nach Integer (ohne Vorzeichen) gewandelt. Das kann nicht schnell sein.


    Ich kenne jetzt die Speicherstruktur der BBC-Rechner nicht. Vielleicht kommt man da ja mit 0 bis 32767 aus um alle wichtigen Adressen zu erreichen.

  • Leider kommt man mit 16-Bit-Integer mit Vorzeichen nicht sehr weit (-32768 bis +32767). Damit könnte man auf dem PET nicht mal den Bildschirmspeicher adressieren. Spannend wird es ab 24-Bit-Integer. Aber ob das dann noch so viel schneller ist, als FP.

    Den Einwand verstehe ich nicht ganz. Ob mit oder ohne Vorzeichen ist doch nur Interpretationssache: Die CPU sieht am Ende einfach nur 16 bit, und diese bestimmen den Adressraum. Nach 32767 / 0x7ff geht's halt mit -32768 / 0x8000 weiter. Wenn Du einen Wert in, sagen wir mal, 0x8010 schreiben möchtest, wäre das mit unsigned int halt "POKE 32784, xx" und mit signed int "POKE -32752, xx". So hat's beispielsweise auch Steve Wozniak im Apple Integer Basic gemacht.

  • PS: mich interessieren zuvorderst klassische Interpreter, aber falls es schnelle, gar interaktive Compiler gab, wäre auch interessant zu wissen

    Der BASIC BOSS (https://www.c64-wiki.de/wiki/Basic-Boss) war recht schnell, vor allem, wenn man ihm mit entsprechenden Compilerdirektiven auf die Sprünge geholfen hat.


    Und hier gab es einen Compiler-Vergleichstest: https://archive.org/details/64er_1994_08/page/n25/mode/2up

    (Wobei ich die technische Kompetenz der 64'er Redaktion im Rückblick ja eher skeptisch sehe, und die der späten Jahre gleich doppelt...)

  • So wird es im Locomotive BASIC gemacht.


    Signed 16-bit Integers

    Defined using % after the variable name, e.g., integer%=500. You can force all variables starting with specific letters to be this type by using the DEFINT keyword. These can store values between -32,768 and 32,767. To assign a 16-bit value to a signed integer directly, you should give the number in a hexadecimal format, e.g., uint=&c0000.

  • Leider kommt man mit 16-Bit-Integer mit Vorzeichen nicht sehr weit (-32768 bis +32767). Damit könnte man auf dem PET nicht mal den Bildschirmspeicher adressieren. Spannend wird es ab 24-Bit-Integer. Aber ob das dann noch so viel schneller ist, als FP.

    Den Einwand verstehe ich nicht ganz. Ob mit oder ohne Vorzeichen ist doch nur Interpretationssache: Die CPU sieht am Ende einfach nur 16 bit, und diese bestimmen den Adressraum. Nach 32767 / 0x7ff geht's halt mit -32768 / 0x8000 weiter. Wenn Du einen Wert in, sagen wir mal, 0x8010 schreiben möchtest, wäre das mit unsigned int halt "POKE 32784, xx" und mit signed int "POKE -32752, xx". So hat's beispielsweise auch Steve Wozniak im Apple Integer Basic gemacht.

    Ja, kann man alles machen. Und wird auch super übersichtlich und nachvollziehbar, wenn ich beim PET statt POKE 59468,xx POKE -6048,xx schreiben müsste.Aber wenn ich mir den "." statt "0" Fetischismus in vielen Basic-Programmen anschaue, dann wäre es da auch nicht mehr drauf angekommen.

    Dann doch lieber gleich Assembler, das ist dann wenigstens lesbar.


    Was ein Glück, dass der PET kein Integer-Basic hatte. :D

  • PS: mich interessieren zuvorderst klassische Interpreter, aber falls es schnelle, gar interaktive Compiler gab, wäre auch interessant zu wissen

    Der BASIC BOSS (https://www.c64-wiki.de/wiki/Basic-Boss) war recht schnell, vor allem, wenn man ihm mit entsprechenden Compilerdirektiven auf die Sprünge geholfen hat.


    Und hier gab es einen Compiler-Vergleichstest: https://archive.org/details/64er_1994_08/page/n25/mode/2up

    (Wobei ich die technische Kompetenz der 64'er Redaktion im Rückblick ja eher skeptisch sehe, und die der späten Jahre gleich doppelt...)

    Bin mir nicht mehr sicher, aber hatte nicht Stephan Scheuer erst vor ein paar Monaten irgendwo in einem Thread eine Vergleichstabelle zu C64 BASIC Compilern gepostet?

    Finde es leider nicht mehr.

  • Den Einwand verstehe ich nicht ganz. Ob mit oder ohne Vorzeichen ist doch nur Interpretationssache: Die CPU sieht am Ende einfach nur 16 bit, und diese bestimmen den Adressraum. Nach 32767 / 0x7ff geht's halt mit -32768 / 0x8000 weiter. Wenn Du einen Wert in, sagen wir mal, 0x8010 schreiben möchtest, wäre das mit unsigned int halt "POKE 32784, xx" und mit signed int "POKE -32752, xx". So hat's beispielsweise auch Steve Wozniak im Apple Integer Basic gemacht.

    Richtig, aber es ist dennoch recht mühsam und ziemlich unschön für den Programmierer da herumkonvertieren zu müssen. Das ist wie oben für Locomotive BASIC recht elegant gelöst, wenn man eine Syntax für Hex-Zahlen hat, die vorzeichenlos betrachtet werden. Das ist für Adressen dann auch die umgänglichere Schreibung. :)

  • Aber ob das dann noch so viel schneller ist, als FP.

    Also selbst 32 Bit Fixed-Point-Arithmetik ist deutlich schneller als FP. Die FP-Mantisse hat beim CBM-BASIC zwar auch nur 4 Bytes, aber das ganze Drumherum mit Normalisieren, Runden und das Exponenten-Handling, kostet auch noch einiges.

    Man darf nicht vergessen, dass beim Interpretieren auch mit Integer-Variablen Konstanten im Programm die Bremse darstellen. Die Umwandlung das Konstanten-Strings in die Binärrepräsentation (egal ob Integer oder FP) ist vergleichsweise aufwändig. Da kommen dann andere Sachen ins Spiel, wie Konstanten in Variablen parken und wie schnell der Variablenzugriff schließlich ist ... ;)

  • Die im C64-Wiki? Oder meintest du EgonOlsen71? Mit ihm verbinde ich eher BASIC-Compiler etc.

    Ich kann mich an diese Liste erinnern: Geschwindigkeit von Rechnungen in BASIC


    Vor ein paar Wochen habe ich Experimente mit Apfelmännchen auf C64 (BASIC V2 und Simons' Basic) und Atari (Atari Basic, MS BASIC und Turbo Basic XL) mit verschiedenen Compilern durchgeführt und das ganze auf den (effektiven) Takt des C64 normiert. Leider habe ich die Ergebnisse wohl irgendwie...ähem...verloren...da kam raus: Atari Basic ist langsam, MS BASIC für den Atari ist etwas langsamer als die C64-Variante und das Turbo Basic trägt seinen Namen zu Recht. So ganz grob...

  • Mallard hält den Geschwindigkeitsrekord unter den Dampflokomotiven, danach hat Locomotive Software den mit der Joyce ausgelieferten BASIC-Interpreter benannt.

    :ChPeace:ChPeace:ChPeace:ChPeace