Speicherbereich umdrehen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

@Deeem:
L2 stimmt bei mir in der Mitte nicht (von 0-9 in der Mitte 4,5 verkehrt) und
L3 liefert ganz komische Sachen...

Im Moment sind bei mir die einzigen Prozeduren die funktionieren wie sie
sollen meine und die originale... Aber die Ansätze sind genial!
Ich wäre froh, wenn das noch jemand testen könnte!
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Hallo Nick.
hier meine "Versuchsanordnung":

Code: Alles auswählen

 
Procedure TurnArrayL(buffer.l,laenge.l) 
           MOV Eax,buffer 
           MOV Ebx,buffer 
           ADD Ebx,laenge 
            TA_begin: 
                        MOV Ecx, dword[Ebx] 
                        XCHG dword[Eax], Ecx 
                        MOV dword[Ebx], Ecx 
                       ADD Eax,4 
                       SUB Ebx,4 
            CMP Eax,Ebx 
            JBE l_ta_begin          
EndProcedure 




Procedure TurnArrayL2(buffer.l,laenge.l) 
  MOV Eax,buffer 
  MOV Ebx,buffer 
  ADD Ebx,laenge 
  TA_begin22: 
    MOV Ecx, dword[Ebx] 
    MOV Edx, dword[Eax] 
    MOV dword[Eax], Ecx 
    MOV dword[Ebx], Edx 
    ADD Eax,  4 
    ADD Ebx, -4 
    CMP Eax, Ebx 
  JBE l_ta_begin22          
EndProcedure



Procedure TurnArrayL3(Buffer.l,laenge.l) 
  MOV Eax, Buffer 
  XOR Esi, Esi 
  MOV Ebx, laenge 
  SHR Ebx, 2 
  TA_begin23: 
    MOV Ecx, dword[Eax+Ebx*4] 
    MOV dword[Eax+Esi*4], Ecx 
    MOV Ecx, dword[Eax+Esi*4] 
    MOV dword[Eax+Ebx*4], Ecx 
    INC Esi 
    DEC Ebx 
    CMP Esi, Ebx 
  JA l_ta_end3 
    MOV Ecx, dword[Eax+Ebx*4] 
    MOV dword[Eax+Esi*4], Ecx 
    MOV Ecx, dword[Eax+Esi*4] 
    MOV dword[Eax+Ebx*4], Ecx 
    INC Esi 
    DEC Ebx 
    CMP Esi, Ebx 
  JA l_ta_end3 
    MOV Ecx, dword[Eax+Ebx*4] 
    MOV dword[Eax+Esi*4], Ecx 
    MOV Ecx, dword[Eax+Esi*4] 
    MOV dword[Eax+Ebx*4], Ecx 
    INC Esi 
    DEC Ebx 
    CMP Esi, Ebx 
  JA l_ta_end3 
    MOV Ecx, dword[Eax+Ebx*4] 
    MOV dword[Eax+Esi*4], Ecx 
    MOV Ecx, dword[Eax+Esi*4] 
    MOV dword[Eax+Ebx*4], Ecx 
    INC Esi 
    DEC Ebx 
    CMP Esi, Ebx 
  JBE l_ta_begin23 
    
  TA_End3: 
  ProcedureReturn 
EndProcedure
  

Procedure TurnArrayL4(buffer.l,laenge.l) 

    MOV esi,buffer
    MOV edi,esi
    ADD edi,laenge        ;korrekt laenge-4
weiter: 
    CLD 
    !LODSD 
    MOV edx,[edi]
    STD
    !STOSD
    MOV [esi-4],edx
    CMP esi,edi
    JB l_weiter

EndProcedure


*buffer = AllocateMemory(10000000)
laenge=10000000-4

 
  StartTime = ElapsedMilliseconds() 
  For i = 1 To 1000 
    TurnArrayL(*buffer,laenge) 
  Next i 
  Debug = ElapsedMilliseconds()-StartTime 
 

  Debug "########"

  StartTime = ElapsedMilliseconds() 
  For i = 1 To 1000 
    TurnArrayL2(*buffer,laenge)    
  Next i 
  Debug = ElapsedMilliseconds()-StartTime 
  

  Debug "########"

  StartTime = ElapsedMilliseconds() 
  For i = 1 To 1000 
    TurnArrayL3(*buffer,laenge)    
  Next i 
  Debug = ElapsedMilliseconds()-StartTime 
 
 
  Debug "########"

  StartTime = ElapsedMilliseconds() 
  For i = 1 To 1000 
    TurnArrayL4(*buffer,laenge)    
  Next i 
  Debug = ElapsedMilliseconds()-StartTime   
Die LOD- und STOS-Befehle kennt PB nicht, aber so wie von mir übermittellt sollte es doch funktionieren. Mit nicht getestet meinte ich, dass ich nicht die Werte-Korrektheit überprüft habe; und zwar geht es hier um die "ominöse" Mitte.
@Sylvia: Viel hab ich nicht gemacht, aber der aktuelle Code folgt in Kürze.

Zurück vom Kindergeburtstag wünscht Allen eine gute Nacht
Helle
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Helle: Geschwindigkeitsvergleiche mit dem Debugger kannst du vergessen. Ich bin grad am testen. Aber bei deinen Testwerten kann es sich ja nur noch um Stunden halten.

Oh, fertig...

Laut meinem Ergebnis ist der Sieger [c]TurnArrayL2()[/c], dann Nummer 3, dann 4 und zuletzt Nr. 1.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

@Nick: Mein vom Steuerzahler gesponserter Arbeitsplatz-PC (2,2GHz Athlon64) zeigt folgende Werte an:
- L1: 137,062s
- L2: 140,766s
- L3: 143,734s
- L4: 108.266s
Tendenz wie auch auf meinem Home-PC.
Vielleicht solltest Du dich doch langsam mal von deinem 386-er trennen :mrgreen: !?

Gruss
Helle
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@Helle:
Man kann nicht immer von dem neusten ausgehen. Zudem reicht mir mein bisheriger PC noch. Und ich weiß genau, das Windows wieder nicht hochfährt, wenn ich mir ein neues Mainboard und CPU reinhaue. Das war schonmal der Fall. Dann konnte ich es wieder neuinstallieren. In der Beziehung ist Windows einfach doof. Noch nichtmal kompatibel zu einer anderen Hardware bei selber Installation.

Aber um davon mal abzusehen: Anscheinend brauchen die Befehle, die hier benutzt werden, auf verschiedenen CPU verschieden viele Takte um ausgeführt zu werden. Da wird das ganze auf einem Pentium wahrscheinlich langsamer oder schneller als auf einem AMD laufen.

Und wenn ich mir deine Werte so anschaue, wunder ich mich ein bisschen.
Dein Code braucht bei mir pro Schleife durchschnittlich 33 Sekunden, aber nicht 130. Hast du die Schleifen oder den Speicherbereich noch größer gemacht?
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

ist doch sicherlich ein Beamten-PC.
Da läuft vieles langsamer....
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

[eot]
Ach :?

Und da heißt es dann statt "Willkommen" "Hallo erstmal, ich weiß garnicht, ob sie´s wussten, aber sie könnten sich jetzt einloggen.......Müssen sie aber nicht" oder wie? :?
[/eot]
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Von wegen Beamten-PC :lol: ! Aber es schon ein Kreuz mit dem Debug-Modus; selber wieder reingefallen. Werte mit EXE:
- L1 : 23,265s
- L2 : 12.672s
- L3 : 12,625s
- L4 : 12,766s
Hätte nicht gedacht, dass das hier so einen riesigen Einfluss hat. Nach Betrachten obiger Werte nehme ich natürlich das mit dem 386-er zurück :D !
Meine Routine hat noch dazu den Nachteil, das zum Ende ein "CLD" zur Sicherheit nachgeschoben werden muss. Evtl. gab es deshalb Probleme.

Gruss
Helle
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Franky hat geschrieben:[eot]
Ach :?

Und da heißt es dann statt "Willkommen" "Hallo erstmal, ich weiß garnicht, ob sie´s wussten, aber sie könnten sich jetzt einloggen.......Müssen sie aber nicht" oder wie? :?
[/eot]
:lol: :lol: :lol: :lol: :lol: :bounce: =) >:) :mrgreen: :lol: :iamwithstupid:

Ich glaub ich kauf mir mal son XP-StylerTool und zeichne das StartBild um ^^.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Also L3 gibt falsche Werte, L4 bringt das Programm zum Absturz, wenn ich
danach einen MessageRequester starte...

Code: Alles auswählen

  
  Procedure TurnArrayL(buffer.l,laenge.l) 
    MOV Eax,buffer 
    MOV Ebx,buffer 
    ADD Ebx,laenge 
    TA_begin: 
    MOV Ecx, dword[Ebx] 
    XCHG dword[Eax], Ecx 
    MOV dword[Ebx], Ecx 
    ADD Eax,4 
    SUB Ebx,4 
    CMP Eax,Ebx 
    JBE l_ta_begin          
  EndProcedure 
  
  
  Procedure TurnArrayL2(buffer.l,laenge.l) 
    MOV Eax,buffer 
    MOV Ebx,buffer 
    ADD Ebx,laenge 
    TA_begin22: 
    MOV Ecx, dword[Ebx] 
    MOV Edx, dword[Eax] 
    MOV dword[Eax], Ecx 
    MOV dword[Ebx], Edx 
    ADD Eax,  4 
    ADD Ebx, -4 
    CMP Eax, Ebx 
    JBE l_ta_begin22          
  EndProcedure 
  
  
  
  Procedure TurnArrayL4(buffer.l,laenge.l) 
    
    MOV Esi,buffer 
    MOV edi,Esi 
    ADD edi,laenge        ;korrekt laenge-4 
    weiter: 
    CLD 
    !LODSD 
    MOV Edx,[edi] 
    STD 
    !STOSD 
    MOV [Esi-4],Edx 
    CMP Esi,edi 
    JB l_weiter 
    
  EndProcedure 
  
  
  *buffer = AllocateMemory(1000000) 
  laenge=1000000-4 
  
  
  StartTime1 = ElapsedMilliseconds() 
  For i = 1 To 1000 
    TurnArrayL(*buffer,laenge) 
  Next i 
  StartTime1 = ElapsedMilliseconds()-StartTime1
  
  
  StartTime2 = ElapsedMilliseconds() 
  For i = 1 To 1000 
    TurnArrayL2(*buffer,laenge)    
  Next i 
  StartTime2 = ElapsedMilliseconds()-StartTime2 
  
  
  StartTime4 = ElapsedMilliseconds() 
  For i = 1 To 1000 
    ;TurnArrayL4(*buffer,laenge)    
  Next i 
  StartTime4 = ElapsedMilliseconds()-StartTime4
  
  MessageRequester("", Str(StartTime1) + " " + Str(StartTime2) + " " + Str(StartTime4))
(L3 schon mal entfernt..)

Kann das jemand bestätigen?
Antworten