Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Demoprogramm: Geschwindigkeit der schnellen DBNZ-Schleifen Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 28.01.2019 18:03)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini M-Unit, Open-Mini Station
' ============================================================================
' 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

Bisherige Antworten: