AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

bitmap32 and xor

Ein Thema von Trinity.dp · begonnen am 17. Sep 2011 · letzter Beitrag vom 18. Sep 2011
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:37
Oh warte mal. (Alles wieder löschen...)

Deine MemoryAsString() ist auch fehlerhaft. Per CopyMemory kopierst du nicht einzelne Bits, sondern ganze Bytes. Deshalb ist diese Codesequenz auch falsch:
Delphi-Quellcode:
  CopyMemory(@buffer, p, 1);
  if buffer then
    result := result + '1'
Dh. der Output ist womöglich auch inkorrekt!

Den Assembler Code möchte ich momentan nicht entziffern, aber ich schätze mal, da sind auch welche Fehler. Und warum das Ganze in Assembler? Geht ja auch ganz normal?!

probier
Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PByte; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
  end;
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (17. Sep 2011 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Trinity.dp

Registriert seit: 27. Nov 2009
8 Beiträge
 
#2

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:45
Oh warte mal. (Alles wieder löschen...)

Deine MemoryAsString() ist auch fehlerhaft. Per CopyMemory kopierst du nicht einzelne Bits, sondern ganze Bytes. Deshalb ist diese Codesequenz auch falsch:
Delphi-Quellcode:
  CopyMemory(@buffer, p, 1);
  if buffer then
    result := result + '1'
Dh. der Output ist womöglich auch inkorrekt!
Der Output müsste stimmen. Die Funktion war nur ein Überbleibsel von meinem weiteren Test und wird an keiner Stelle benutzt (hab sie jetzt auch gelöscht).

Den Assembler Code möchte ich momentan nicht entziffern, aber ich schätze mal, da sind auch welche Fehler. Und warum das Ganze in Assembler? Geht ja auch ganz normal?!

probier
Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PByte; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
  end;
end;
Assembler Code müsste eigentlich auch stimmen. Ich brauche Geschwindigkeit. Dein Code gibt leider einen Fehler. Ich schaue mal ob ich diesen finden kann!

Vielen Dank schon mal, auch wenn ich immer noch ganz am Anfang stehe.

Edit: Ok es fehlte wirklich nur das decrease. Und mit deinem Code funktioniert es auch. Dann muss ich wohl noch mal den Assembler-Code anschauen.

Edit2: Vielen lieben Dank! Du hast mir sehr geholfen.

Geändert von Trinity.dp (17. Sep 2011 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:47
Ach echt? Habs ja auch nicht getestet, nur schnell hingetippt. Mal kucken...
Ok. Stimmt sry, habe dec(Count) in der Schleife vergessen:

Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PByte; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
    dec(Count);
  end;
end;
Assembler <> Geschwindigkeit, denn letzendlich wird der Delphi-Code, sofern richtig programmiert, auch in Assembler-Code konvertiert (kompiliert)!
Außer du wendest Assembler-eigene Tricks an, die ich nirgends sehe!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (17. Sep 2011 um 13:50 Uhr)
  Mit Zitat antworten Zitat
Trinity.dp

Registriert seit: 27. Nov 2009
8 Beiträge
 
#4

AW: bitmap32 and xor

  Alt 17. Sep 2011, 13:58
Assembler <> Geschwindigkeit, denn letzendlich wird der Delphi-Code, sofern richtig programmiert, auch in Assembler-Code konvertiert (kompiliert)!
Außer du wendest Assembler-eigene Tricks an, die ich nirgends sehe!
Du hast recht. Dein Code ist nur unwesentlich langsamer als der Assembler-Code (~600ms vs ~450ms). Das sollte für meine Zwecke immer noch reichen. Du kannst dir gar nicht vorstellen wie glücklich ich bin! Vielen, vielen Dank!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: bitmap32 and xor

  Alt 17. Sep 2011, 17:37
Man kann übrigens auch verständlichen Assembler-Code schreiben

Delphi-Quellcode:
procedure MemBlockXOR_2(Source1, Source2, Destination: Pointer; Count: Integer);
asm
  push edi;
  push esi;

  mov esi, eax;
  mov edi, ecx;
  mov ecx, Count;
  shr ecx, 2; // div by 4 (sizeof int)

  // esi <- Source1
  // edx <- Source2
  // edi <- Destination
  // ecx <- Count

  // exit if count = 0
  test ecx, ecx;
  jz @@end;

  @@loop:
  mov eax, [esi];
  xor eax, [edx];
  mov [edi], eax;

  add esi, 4;
  add edx, 4;
  add edi, 4;

  dec ecx;
  jnz @@loop;

  @@end:

  pop esi;
  pop edi;
end;
Einen Tick schneller als dein ursprünglicher Code ist er zudem auch noch, und er besteht alle Tests. Allerdings funktioniert er nur bei ganzen Integer-Grenzen, also wenn Count durch 4 teilbar ist, sonst wird der Rest abgeschnitten (nicht ge-xor’t). Wie dein Original-Code das handhabt, konnte ich nicht entziffern. Aphtons Variante funktioniert immer, ist jedoch langsamer, weil sie mit Bytes arbeitet.
  Mit Zitat antworten Zitat
Trinity.dp

Registriert seit: 27. Nov 2009
8 Beiträge
 
#6

AW: bitmap32 and xor

  Alt 18. Sep 2011, 01:00
Hallo NamenLozer,

für mein Beispiel funktioniert dein Code zwar, allerdings muss er irgendwo einen Fehler enthalten. In meinem "richtigen" Programm funktioniert er jedenfalls gar nicht. Der Parameter Count ist bei mir immer eine durch vier teilbare Zahl, da dieser als Faktor sizeof(tcolor32) beinhaltet.

Ich werde mir deinen asm morgen (ausgeschlafen) mal zu Gemüt führen.

Schöne Grüße,
trin

Geändert von Trinity.dp (18. Sep 2011 um 01:03 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: bitmap32 and xor

  Alt 18. Sep 2011, 01:17
Hmm, seltsam, eigentlich sehe ich keinen Grund, warum er nicht funktionieren sollte. Aber ist ja auch nicht so wichtig... so groß ist der Geschindigkeitsvorteil ja auch nicht – im Zweifelsfalle sollte man da eh die lesbarere und portablere Variante bevorzugen.

Wenn die Länge immer durch 4 teilbar ist, kannst du den Code ja auch noch ein bisschen optimieren, indem du es PByte in PInteger änderst:
Delphi-Quellcode:
procedure XorMemBlock(Source1, Source2, Destination: PInteger; Count: Integer);
begin
  while Count > 0 do
  begin
    Destination^ := Source1^ xor Source2^;
    inc(Source1);
    inc(Source2);
    inc(Destination);
    dec(Count);
  end;
end;
Wie viel das in der Praxis ausmacht, kann ich nicht sagen, aber theoretisch sollte es schneller sein, weil der Prozessor eh immer 4 Bytes auf einmal lädt und somit weniger oft Daten aus dem RAM holen muss, wenn man immer in Vierer-Schritten arbeitet, als wenn man sich byteweise durcharbeitet.

Count musst du dann natürlich auch durch den Faktor 4 teilen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz