Hallo Besucher, der Thread wurde 2,4k mal aufgerufen und enthält 17 Antworten

letzter Beitrag von hannenz am

Code-Optimierung:Wie wird Start- und Endzeit einer Routine ermittelt?

  • Code-Optimierung: Wie wird Start- und Endzeit einer Routine ermittelt?


    Hi,


    ich schreibe gerade an Verschiebroutinen von Speicherbereichen
    und frage mich, ob die ROM-Routine $A3BF schneller ist, als die
    uebliche, indirekte Adressierung mit dem Y Register - oder ob es
    ggf. sogar schneller waere, innerhalb des Programmablaufs, die
    passende Daten direkt von Diskette in den Speicher zu laden .


    Kurz, wie messe ich 'relativ genau' die Zeit, in Milli-
    sekunden, die jede dieser 3 Varianten braucht, um 8K
    Speicher auf einmal nach $2000 zu Verschieben ?



    3 Beispiele (Welches ist schneller???):



    1. ROM Verschieberoutine (Turbo Assembler Syntax)


    2. EIGENE Verschieberoutine (Turbo Assembler Syntax)


    3. LOAD Verschieberoutine (Turbo Assembler Syntax)

  • wenn es nicht super exact sein muss, nimm doch einfach TI zur hilfe.... also sowas in der art:


    TI$="000000":sys 828:print TI


    wenn es richtig genau sein soll kannst du die cia timer zur hilfe nehmen ... oder aber einfach selber ausrechnen.


    in deinem konkreten fall da würde ich aber vermuten das alle 3 versionen in etwa gleich schnell sind.


    und ausserdem sind direkte einsprünge ins basic- und kernal rom "böse" =) ich würde immer davon abraten.

  • Ausser den CIA timern gibt es da nix.
    Und ich bin mir gerade nicht sicher, aber sind die CIA timer nicht nur 2 byte zähler? dann wären die auch sehr schnell am ende, und es macht be längeren routinen auch keinen sinn die zu verwenden.
    Am besten ist wirklich selber ausrechnen.
    Und alles was innerhalb eines frames abläuft kann man ja noch graphisch anzeigen lassen


    einfach sowas wie:


    sei
    lda #ff
    cmp$d012
    bne *-2
    inc d020
    jsr testroutine
    dec d020
    jmp (zum lda#ff)


    ...und wenn du $TI nehmen willst, kannst du auch gleich ne Stopuhr verwenden :roll2:

  • Für sehr exakte Messungen ist das mit den Timern schon korrekt. Man kann die Timer auch verbinden, so daß man 32 Bit zählen kann, das reicht dann schon bis über eine Stunde. Der Monitor, der beim Professional-Ass dabei war, hatte dafür schon extra ein Kommando, das sich danna uch ordentlich um die Bildschirmabschaltung gekümmert hat.


    Wenn's nicht so wahnsinnig genau kommt und das Programm lang genug läuft ist TI gar nicht verkehrt, muß man nur vorher die IRQ's mal was hochsetzen:
    Poke56325,0:Ti$="000000":SysMachirgendwas:Printti:Poke56325,64

  • Hab mir das mit dem Timer und CIA angesehen bzw.
    Seite 281-288 in C64 Tips und Tricks, die Sache mit
    der Anzeige der Uhrzeit als IRQ-Routine. (Wozu hat
    man denn seine Data Becker Sammlung.)


    Das ist wohl echt'ne Nummer zu genau - Hauptsache
    am Ende stimmt die Gesamtrechnung bzw. die FPS
    liegt bei minimum. 12 - 16 FPS. Das wuerde mir schon
    reichen.


    Jetzt widme ich mich erstmal wieder der Uebernahme
    der Binaer- bzw. Pixeldaten (pbm2hires Konverter),
    da haeng ich ja auch noch ganz schoen am Zaun. :baby2:


    Danke.

  • Öhm, selbes Problem hatte ich auch damals. Und hab mir mal ein Progrämmchen dazu geschrieben. Das habe ich 2005 oder so mal aus Fun auf dem acme probiert nachzustellen. Ging soweit.


    Ich hänge das ASMchen mal hinten dran. Das Teil zählt jedenfalls die Taktzyklen zwischen zwei calls. Höchstens der Rasterzeilenaufbau kann da für Schwankungen sorgen, ansonsten ist das genau.


    Ich werd das wohl demnächst auf cc65/ca65 übersetzen. Aber das ist ja leicht, daher stell ich das mal hier rein. Hoffe geholfen zu haben.

  • Falls jemand das für den cc65-Assembler angepasst hat, wäre ich erfreut über ein Reposting. In meiner Signatur findet man ansonsten noch einige andere kleinere Goodies aus der Zeit. Das meiste ist Verschütt gegangen damals. Hunderte Disketten mit wertlosen Spielen haben überlebt, aber meine eigenen Sourcecodes sind alle weg. Und das war nicht ganz wenig. Aber so läuft es wohl.

  • Wenn die Disketten von den Rasalhaguern gemacht wurden kein wunder........ importier das nächste mal welche bei uns Steinern! *grins**duck**renn* ;)

  • Nehneh, ich hab damals keine BASF (BitAbweisenderSchutzFilm) gekauft, sondern nur beste Maxell und Scotch. Und die wenigen Disks, die seit den 80ern noch überlebt haben, können auch immer noch einwandfrei gelesen werden. Erstaunlich wenige Ausfälle. Es ist einfach so, dass meine Disks weg sind. Richtig weg.


    So echte persönliche Bindung ist aber für einen Claner schwer nachzuvollziehen. Während ein richtiger Mensch, sollte er schwächlich sein und nicht mit dem Blut Raselhaager Vorfahren geadelt, sich in den Bauch seiner Mami zurückwünscht, will ein Claner letztendlich eigentlich immer zur Soße werden, die man bei seiner Entstehung ins Reagenzglas gerührt hat. Muttergefühle sozusagen - obwohl die meisten Claner meiner Meinung nach nicht in Reagenzgläsern sondern in Schnappsgläsern zusammengemixt wurden, die niemand richtig saubergespült hat vorher. Und bei dem, was am Ende rauskommt, muss es übler Fusel sein, den ihr benutzt um über euer Mutterproblem hinwegzukommen. Aber das mit der Soße ist sehr viel einfacher zu bewerkstelligen als einen erwachsenen Mann in seine Mutter zu quetschen. Für das Soßenproblem haben wir zum Glück Gausskanonen und können euch da helfen.


    Ist der Raselhaag-Treffer jetzt Zufall gewesen oder habe ich deinen Schrott-Mech schon mal vernichtet? :D


    Wahrheit über Clanleben
    Lyrik des 4ten Jahrtausends

  • Zitat

    So echte persönliche Bindung ist aber für einen Claner schwer nachzuvollziehen. Während ein richtiger Mensch, sollte er schwächlich sein und nicht mit dem Blut Raselhaager Vorfahren geadelt, sich in den Bauch seiner Mami zurückwünscht, will ein Claner letztendlich eigentlich immer zur Soße werden, die man bei seiner Entstehung ins Reagenzglas gerührt hat. Muttergefühle sozusagen - obwohl die meisten Claner meiner Meinung nach nicht in Reagenzgläsern sondern in Schnappsgläsern zusammengemixt wurden, die niemand richtig saubergespült hat vorher. Und bei dem, was am Ende rauskommt, muss es übler Fusel sein, den ihr benutzt um über euer Mutterproblem hinwegzukommen. Aber das mit der Soße ist sehr viel einfacher zu bewerkstelligen als einen erwachsenen Mann in seine Mutter zu quetschen. Für das Soßenproblem haben wir zum Glück Gausskanonen und können euch da helfen.


    *BRÜLL* :bgdev

  • Zitat

    Original von Hanno Behrens
    So echte persönliche Bindung ist aber für einen Claner schwer nachzuvollziehen. Während ein richtiger Mensch, sollte er schwächlich sein und nicht mit dem Blut Raselhaager Vorfahren geadelt, sich in den Bauch seiner Mami zurückwünscht, will ein Claner letztendlich eigentlich immer zur Soße werden, die man bei seiner Entstehung ins Reagenzglas gerührt hat. Muttergefühle sozusagen - obwohl die meisten Claner meiner Meinung nach nicht in Reagenzgläsern sondern in Schnappsgläsern zusammengemixt wurden, die niemand richtig saubergespült hat vorher. Und bei dem, was am Ende rauskommt, muss es übler Fusel sein, den ihr benutzt um über euer Mutterproblem hinwegzukommen. Aber das mit der Soße ist sehr viel einfacher zu bewerkstelligen als einen erwachsenen Mann in seine Mutter zu quetschen. Für das Soßenproblem haben wir zum Glück Gausskanonen und können euch da helfen.


    Na dann viel Spass mit euren Reagenzgläsern... werden daraus eigentlich nachher eure Brillen gefertig? Ich mein, Recycling ist ja in.....


    Zitat

    Original von Hanno Behrens
    Ist der Raselhaag-Treffer jetzt Zufall gewesen


    Nö, Homepage lesen ;)


    Zitat

    Original von Hanno Behrens
    oder habe ich deinen Schrott-Mech schon mal vernichtet? :D


    Nein, es sei denn du hast gegen Freechapter gespielt, und dann haben wir eher mit euch Mechforclern den Boden gewischt. :winke:
    Marco Sommermanns Königskrabenkopf ist immer noch meiner, naja, was geht der Held auch den Berg hoch... Mein Donnerkeil SS hat dann halt ne Runde Fußball gespielt. :bgdev


    Gedient habe ich in der 11. Lyranischen (Steiner) und danach bei den Desert Eagles (Söldner mit dauerhaftem Steiner Kontrakt).
    Alles Freechapter und alles 3025. Wir haben nach RoW gespielt, alles was danach kam an Regelwerk war SpritzTech und kein BattleTech.
    Leider hat sich das dann nachher auseinander gelebt nachdem mein Vater und ich ein paar Unschöne Streitereien hatten mit unserem Kommandanten Stefan Rogos.
    Kurz und Bündig, wir haben uns nicht "verkaufen" lassen....


    @Rest:
    Normale Seitenhiebe zwischen verschiedene Fraktionen von BattleTech Spielern, gehört zum guten Ton ;)

  • Anstalt? Nun, wir versuchen das in der Regel auf dem Schlachtfeld zu klären. Aber zugegebenermaßen war ich nicht sonderlich lange bei Mechforce aktiv. Nach meiner "Pressearbeit" für die freie Republik Raselhaag, die kleinste Fraktion des Spieles, die schwächste, mit den geringsten Ressourcen und größtenteils erobert durch die Clans (bei Spielbeginn), hatten wir -Wunder über Wunder- wilde Rangeleien, wer sich als erstes auf uns stürzen darf. Und da die Wettbewerbsbedingungen nicht gerade für unsere Seite, speziell für unsere Fraktion standen, haben wir bei dem Ansturm deutlich mehr verloren als gut gewesen wäre in unserer Situation. Und so waren wir bei weitem die erste Fraktion, die den Kampfplatz gezwungenermaßen räumen musste (erobert, vernichtet, ausgelöscht, erniedrigt und geplündert, in Brand gesteckt und entvölkert - aber war ein guter Kampf). Aber wir sind mit einem solchen Bang gegangen, dass die Gegenseite derartig viele Mechs verschlissen hatte und in kürzester Zeit bei dem Versuch uns mit aller Kraft aus dem Spiel "zu entfernen", dass der Rest der Inneren Sphäre es *fast* geschafft hätte zu gewinnen. Nun. Fast.


    Die Bedingungen waren und sind sehr schwierig für die Sphäre. Unterlegene Technologie, begrenzte Ressourcen und die Spielmacher lieben einfach die Clans. Eine gewisse Übermächtigkeit der Clanmechs war 2001 unübersehbar. Weiss nicht, ob sich das geändert hat. Jedenfalls findet man auf den obigen Links eine rundenbasierte Version von Mechforce (Battletech) für den Amiga. Meiner Meinung nach nie wieder erreicht.


    Aber das führt wohl offtopic.

  • Wie ich anmerkte, wäre es nicht schwer, die oben vorgestellten Routinen für cc65/ca65 anzupassen. Das ist hiermit geschehen. Außerdem habe ich die Timerroutinen jetzt so verbessert, dass sie sich inert zu Register- und Statusflags zeigen. Sprich man kann sie sogar inmitten von Schleifen einbauen, ohne die Schleifenvariablen in den Registern zu verlieren. Die korrekte Zyklenzahl für zwei aufeinanderfolgende JSR ist natürlich Null. Ein NOP gibt 2, zwei NOP geben 4, soweit alles korrekt. Sobald ihr in euren Routinen mit BSOUT ein Zeichen ausgebt, habt ihr den Interrupt wieder aktiviert, der bei Starten der Timer deaktiviert wird ("SEI"). Das hat zur Folge, dass euch das System alle paar Aufrufe zufällig die Zyklen für den Interruptaufruf draufbuttert. Also für präzise Messungen bitte keine Ausgaben zwischen _tistart und _tistprint.


    Ich glaube, die Routinen benutzen für die Ausgabe das Kernel- und Basic-Rom, also aufgepasst, dass ihr das während der Nutzung auch eingeschaltet habt, ebenso wie die CIA2. Ansonsten gibts lustige Effekte.

    Code
    1. jsr _tistart
    2. ...
    3. jsr _tistprint


    oder

    Code
    1. jsr _tistart
    2. ....
    3. jsr _tistop
    4. ...
    5. jsr _tiprint


    Damit alle glücklich sind, hab ich noch das Objektfile dazugepackt und damit sollte es problemlos auch unter C einsetzbar sein (Aufruf mit tistart(), tistprint() usw.) Obwohl ich bislang nicht getestet habe, wie unter C die Taktzyklenkorrektur sein müsste. Ich hab da noch ein c64io.inc-ASM-Includefile zugepackt mit einer .struct drin, weil ich denke, dass das der eleganteste Weg ist, um mit den Offsets der Register umzugehen.


    Wen das mit den Taktzyklen irritiert, hier nochmal eine Erklärung. Die Timer zählen jede Zyklus des Prozessortaktes um einen hoch. Also ungefähr mit knapp unter 1 MHz. Sprich wenn ihr reale Zeit haben wollt, teilt ihr das durch die Taktfrequenz und bekommt die Sekunden heraus.
    Die Randnotiz mit den Interrupts bezieht sich auf folgenden Effekt: wenn ihr eine längere Schleife laufen habt, und das System startet einen Interrupt, wird eure Routine unterbrochen für den Systemaufruf und erst wieder fortgesetzt, wenn diese beendet wurde; der Timer jedoch läuft indes weiter. Sprich da habt ihr einen falschen Wert.


    Ebenfalls verfälschte Werte gibt es, wenn der Prozessor für ein paar Zyklen nicht darf, weil der VIC gerade *unbedingt* seinen blöden Bildaufbau machen will. Bildschirmausgaben - wozu das, fragt man sich? Hätte es ein Teletype-Terminaldrucker nicht auch getan? Neumodischer, interaktiver Scheiss. Wenn ihr die Schnauze voll habt vom vorlauten, neumodischen und acidschluckenden VIC und seinen Primadonna-Spirenzien, schaltet den unnützen Käfer während eurer Messung einfach ab. Er sollte sich ein Beispiel am SID nehmen, der friedlich mit dem Prozessor koexistiert und dem nicht die Zyklen wegschnappt wie sein gieriger Aasgeier von Bruder. Ich frage mich sowieso, was die sich dabei gedacht haben, einen Grafikchip in einen Computer zu bauen. Eine LED und ein Mäuseklavier kostet auch keine Zyklen. Nicht spricht gegen eine Ausgabe über eine morseblinkende LED, oder? Mal im Ernst - Grafik? Wieder so eine Sau, die man durchs Dorf getrieben hat. Braucht kein Mensch. 'ne LED hätt gereicht.
    Meinetwegen, wenns unbedingt sein muss und Drucker-Papier spart, akzeptiere ich grummelnd eine Textkonsole. Aber Grafik? Selten genutzt. Aber wo man sie schon mal hat, installiert man sich am besten Compiz-Fusion, die 3D Desktop-Oberfläche für Linux oder siehe sich die Clips für Beryl an, den Verläufer, startet darauf drei oder vier Vice C64-Emulatoren, läßt die sich mit einem Server im Internet über tcpser koppeln und spielt gemeinsam Internetgames. Und es verkommen zu lassen, wäre ja eine Schande, oder?


    ROTZ DEN SPEICHER WEG, WIR HAMS JA


    Aber eigentlich will ich ne LED, ehrlich! :D


    Feedback erwünscht.

  • hehe - sehr schönes plädoyer!!! :)
    ich benutz deine routine übrigens gerade mit Power-C; wie genau die Messungen da sind über aufrufe von C aus kann ich auch nicht sagen, aber sie geben einen Anhaltspunkt wo noch Optimierungsbedarf besteht, und genau das brauch ich im Moment - kam also wie gerufen; Vielen Dank noch mal.