Speicherbereich umdrehen
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
@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!
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!
Hallo Nick.
hier meine "Versuchsanordnung":
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
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
@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
- 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
- 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
@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?
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?
Von wegen Beamten-PC
! 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
!
Meine Routine hat noch dazu den Nachteil, das zum Ende ein "CLD" zur Sicherheit nachgeschoben werden muss. Evtl. gab es deshalb Probleme.
Gruss
Helle

- 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

Meine Routine hat noch dazu den Nachteil, das zum Ende ein "CLD" zur Sicherheit nachgeschoben werden muss. Evtl. gab es deshalb Probleme.
Gruss
Helle
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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]











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.
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Also L3 gibt falsche Werte, L4 bringt das Programm zum Absturz, wenn ich
danach einen MessageRequester starte...
(L3 schon mal entfernt..)
Kann das jemand bestätigen?
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))
Kann das jemand bestätigen?