Seite 2 von 3

Verfasst: 19.06.2005 17:25
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!

Verfasst: 20.06.2005 01:25
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

Verfasst: 20.06.2005 13:42
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.

Verfasst: 20.06.2005 14:09
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

Verfasst: 20.06.2005 14:39
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?

Verfasst: 20.06.2005 14:57
von Rings
ist doch sicherlich ein Beamten-PC.
Da läuft vieles langsamer....

Verfasst: 20.06.2005 15:10
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]

Verfasst: 20.06.2005 17:10
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

Verfasst: 20.06.2005 17:15
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 ^^.

Verfasst: 20.06.2005 18:33
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?