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: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
 
#2

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
 
#3

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
 
#4

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
 
#5

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
Trinity.dp

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

AW: bitmap32 and xor

  Alt 18. Sep 2011, 12:22
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.
Ist ca. ein Drittel schneller. Viel schneller wäre asm wohl auch nicht. Ich bin begeistert von der super Unterstützung hier! Danke!
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

AW: bitmap32 and xor

  Alt 18. Sep 2011, 14:58
Man sollte auch mal testen, ob die BitBlt() Funktion nicht schneller und/oder einfacher wäre.
BitBlt() erhält in manchen Fällen eine Hardwarebeschleunigung durch die Grafikkarte.
Sollte die Beschleunigung durch die GPU nicht möglich sein wird sehr wahrscheinlich auf MMX/SSE/SSE2 Befehle zurückgegriffen werden.
  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 21:51 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