![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' Geschwindigkeit der schnellen DBNZ-Schleifen in OCBASIC und Assembler messen ' In OCBASIC 1.12a_e1 auf der Open-Maxi von Dietmar Harlos am 28. Januar 2019 ' ============================================================================ ' DBNZ-Schleifen sind eine Alternative zu FOR..NEXT-Schleifen und werden ' deutlich schneller als diese ausgeführt. ' In OCBASIC ist der Zähler in der Schleife immer DBNZCTR und belegt auf der ' OM den gleichen RAM-Speicher wie RAND und ERR. Durch den DBNZ-Befehl wird ' der Zähler um eins verringert (dekrementiert) und anschließend gesprungen, ' falls der Zähler ungleich Null ist. ("Decrement and Branch if Not Zero") ' Auch in 6808-Assembler gibt es den DBNZ-Befehl in verschiedenen Varianten. ' Mittels Oszilloskop ermittelte Meßergebnisse: ' Die DBNZ-Schleife in OCBASIC benötigt 1.07 Millisekunden (ms). Das sind ' 20e6*1.07e-3 = 21400 Taktzyklen für die 256 Durchläufe der Schleife. ' Somit 20e6*1.07e-3/256 = 83.6 Taktzyklen pro DBNZ-Befehl. ' Die beiden DBNZ-Schleifen in Assembler benötigen 1.05 ms. Das sind ' 20e6*1.05e-3 = 21000 Taktzyklen für 20*256 = 5120 Durchläufe der Schleifen. ' Somit 20e6*1.05e-3/(20*256) = 4.1 Taktzyklen pro DBNZ-Befehl. Dieser ' gemessene Wert stimmt sehr gut mit dem richtigen Wert 4 Taktzyklen überein. ' Die Meßungenauigkeiten entstehen unter anderem durch den Aufruf der Routine. ' Die DBNZ-Schleife in OCBASIC ist somit nur 83.6/4 = 20.9 mal langsamer als ' das Equivalent in Assembler! Für einen Interpreter ist das ein guter Wert. ' Mit dem OCBASR-Compiler kann auf der Open-Micro, Open-Mini und Open-Midi ' die OCBASIC-DBNZ-Schleife besonders effektiv in Maschinensprache übersetzt ' werden. Sie ist dann um den Faktor 14.2 mal schneller! ' --- Definitionen für das System -------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' --- Definitionen des Anwenders --------------------------------------------- DEFINE myport PORT[1] 'einen Bitport definieren ' --- Das Hauptprogramm ------------------------------------------------------ myport=ON 'Port auf HIGH setzen WHILE TRUE 'Endlosschleife DBNZCTR=256 'von 256 (eigentlich 0) bis 0 zählen in OCBASIC #dbnzloop_bas DBNZ dbnzloop_bas 'leere Schleife TOG myport 'Port toggeln dbnzloop_asm 'Assemblersubroutine aufrufen TOG myport 'Port toggeln WEND End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende, Neustart mit der Enter-Taste ' --- Subroutinen ------------------------------------------------------------ ' Test für DBNZ-Schleifen in Assembler PROCEDURE dbnzloop_asm INLASM ! ldx #20 '20 Schleifendurchläufe in der DBNZX-Schleife #dbnzloop_asm_loop2 ! clra '256 Schleifendurchläufe in der DBNZA-Schleife #dbnzloop_asm_loop ! dbnza dbnzloop_asm_loop ! dbnzx dbnzloop_asm_loop2 ! rts END PROCEDURE ' --- Programmende ---------------------------------------------------------- Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |