AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Optimallösung gesucht: Little Endian <-> Big Endian
Thema durchsuchen
Ansicht
Themen-Optionen

Optimallösung gesucht: Little Endian <-> Big Endian

Ein Thema von FAlter · begonnen am 6. Mai 2008 · letzter Beitrag vom 9. Mai 2008
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#21

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

  Alt 7. Mai 2008, 18:17
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
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#22

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

  Alt 7. Mai 2008, 19:56
Ich habe mir keine weiteren Gedanken über andere Optimierungen gemacht... gibt sicherlich noch bessere Varianten. Im Zweifelsfall hilft immer: Performance messen
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#23

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

  Alt 8. Mai 2008, 16:24
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 Kein Wunder, dass es ne AV gab, wenn die Rücksprungadresse nicht mehr stimmt. [/edit]
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#24

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

  Alt 9. Mai 2008, 06:39
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".
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 13:02 Uhr.
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