Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Optimallösung gesucht: Little Endian <-> Big Endian (https://www.delphipraxis.net/113353-optimalloesung-gesucht-little-endian-big-endian.html)

FAlter 7. Mai 2008 18:17

Re: Optimallösung gesucht: Little Endian <-> Big Endia
 
Hi,

hm, jetzt muss ich mich nur noch für die beste Variante entscheiden, wo ich so viele Angebote habe. Aber drei ror auf den Speicher sind wohl bestimmt nicht so günstig wie zwei MOV mit Speicher und ein bswap mit Register.

Danke erstmal soweit. Und da wollte ich eigentlich ganz was anderes machen und das war nur so nebenbei. Naja, sollte ich mich nach genauer Prüfung für eine Variante entschieden haben, meld ich mich wieder.

Mfg
FAlter

nicodex 7. Mai 2008 19:56

Re: Optimallösung gesucht: Little Endian <-> Big Endia
 
Ich habe mir keine weiteren Gedanken über andere Optimierungen gemacht... gibt sicherlich noch bessere Varianten. Im Zweifelsfall hilft immer: Performance messen :)

FAlter 8. Mai 2008 16:24

Re: Optimallösung gesucht: Little Endian <-> Big Endia
 
Hi,

der Performancetest hat gezeigt, dass bei langen Strings, wie ich sie verwenden möchte, folgendes am schnellsten funktioniert:

Delphi-Quellcode:
procedure SwapBytes(Var S: WideString);
asm
  mov eax, [eax]

  test eax, eax
  jz  @exit

  mov ecx, [eax - 4]
  shr ecx, 1

  push ecx
  shr ecx, 1

  jz @onechar

  @loop:

  mov  edx, [eax]
  bswap edx
  rol  edx, 16
  mov  [eax], edx

  add eax, 4
  dec ecx
  jnz @loop

  @onechar:

  pop ecx
  test ecx, $01 //<-- hier habe ich ein test draus gemacht
  jz  @exit

  mov  dx, [eax]
  xchg dl, dh
  mov  [eax], dx

  @exit:
end;

procedure SwapBytes(Var S: UCS4String);
asm
  mov eax, [eax]

  test eax, eax
  jz  @exit

  mov ecx, [eax - 4]

  @loop:

  mov  edx, [eax]
  bswap edx
  mov  [eax], edx

  add eax, 4
  dec ecx
  jnz @loop

  @exit:
end;
Bei kurzen Strings spielt es kaum eine Rolle, welchen Code man nimmt. Somit scheint die Methode, in Pascal zu denken und dann zu übersetzen, gar nicht so falsch zu sein :)

Mfg
FAlter

[edit] Jetzt weiß ich, was ich in #15 übersehen habe: das pop :mrgreen: Kein Wunder, dass es ne AV gab, wenn die Rücksprungadresse nicht mehr stimmt. [/edit]

nicodex 9. Mai 2008 06:39

Re: Optimallösung gesucht: Little Endian <-> Big Endia
 
Gut zu wissen :)

Nur als Kommentar: Für lokale Labels verwendet man normalerweise @@.
Das einzelne @ braucht man z.B. für den Aufruf von System._WStrLen -> "call System.@WStrLen".


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz