![]() |
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 |
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 :)
|
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:
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 :)
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; 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] |
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 06:41 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