AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign XE2 Stringfunktion + ASM code : function CountString(...)
Thema durchsuchen
Ansicht
Themen-Optionen

XE2 Stringfunktion + ASM code : function CountString(...)

Ein Thema von bernhard_LA · begonnen am 21. Sep 2011 · letzter Beitrag vom 21. Sep 2011
Antwort Antwort
Seite 1 von 2  1 2      
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 10:45
unter http://www.delphipraxis.net/51284-te...n-zaehlen.html gibt es super schnelle String-Funktionen,
leider bei mir nicht mit Delphi XE2 compilierbar

a) um prinzpiell im x32 und x64 bit mode zu kompilieren müssten doch die $IFDEF Definition richtig sein?
b) keyword ASM erzeugt bei mir einen Fehler im x64 bit modus
c) unter x32 bekomme ich folgenden Fehler
[DCC Fehler] _faststrings.pas(1467): E2116 Ungültige Kombination von Opcode und Operanden (bei TEST &SubStr, &SubStr) ??


Delphi-Quellcode:
///
/// Counts number of substr in S
/// source: [url]http://www.delphipraxis.net/51284-teil-string-anderem-string-suchen-zaehlen.html[/url]
///
/// failure with XE2 compiler !!!
function CountString(Const substr, s: AnsiString): Word;
begin
{$IFDEF CPUX86}
    ASM
      PUSH ESI
      PUSH EDI
      PUSH EBX
      TEST &SubStr, &SubStr
      JE @Exit
      TEST &S, &S
      JE @Exit0
      MOV ESI, &SubStr
      MOV EDI, &S
      PUSH EDI
      MOV ECX, [EDI - 4]
      MOV EDX, [ESI - 4]
      DEC EDX
      JS @Fail
      XOR EAX, EAX
      MOV AL, [ESI]
      INC ESI
      SUB ECX, EDX
      JLE @Fail

      @Loop:
      REPNE SCASB
      JNE @Ready
      MOV EBX, ECX
      PUSH ESI
      PUSH EDI
      MOV ECX, EDX
      REPE CMPSB
      POP EDI
      POP ESI
      JNE @noInc
      CMP EAX, $FFFF0000
      JAE @Ready
      ADD EAX, $00010000
      @noInc:
      MOV ECX, EBX
      JMP @Loop

      @Fail:
      POP EDX

      @Exit0:
      XOR EAX, EAX
      JMP @Exit

      @Ready:
      POP EDX
      SHR EAX, 16

      @Exit:
      POP EBX
      POP EDI
      POP ESI
    end;
{$ENDIF CPUX86}
/// x64 bit code
{$IFDEF CPUX64}
       /// ????

      asm



      end;
{$ENDIF CPUX64}
End;

Geändert von SirThornberry (21. Sep 2011 um 13:12 Uhr) Grund: Delphi-Tags gesetzt - nächstes mal bitte selbst machen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 10:56
Ein paar [delphi]-Tags wären nicht schlech.

Delphi-Quellcode:
begin
...
ASM
Geht unter 64 Bit garnicht mehr, da es dort kein Inline-Assemler mehr gibt (in Delphi).
Prozeduren müssen entweder in Pascal oder Assembler geschrieben sein. (gemischt ist nicht mehr ... je Prozedur)

also entweder
Delphi-Quellcode:
function CountString(Const substr, s: WideString): Word;
{$IFDEF CPUX86}
asm
...
end;
{$ENDIF CPUX86}
{$IFDEF CPUX64}
asm
...
end;
{$ENDIF CPUX64}
oder
Delphi-Quellcode:
function CountString(Const substr, s: WideString): Word;
asm
{$IFDEF CPUX86}
...
{$ENDIF CPUX86}
{$IFDEF CPUX64}
...
{$ENDIF CPUX64}
end;

Du könntest dir die WideString-Varianten nehmen und müßtest unter Win64 die Register anpassen.
Unter 32 Bit lagen die ersten Parameter in EAX, EDX, ECX, welche aber bei 64 Bit nun anders vereilt sind. Irgenwo wurde das hier, in der DP, vor Kurzem mal erwähnt.

Für den Anfang also einfach nur die entsprechenden 32-Bit-Register der 64-Bit-Architektur verwenden.


Wenn ich mal die Zeit finde, läßt sich dann bestimmt noch einiges Optimieren. (mit MMX, SSE und Co.)
$2B or not $2B

Geändert von himitsu (21. Sep 2011 um 11:02 Uhr)
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#3

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 12:06
Ein paar [delphi]-Tags wären nicht schlech.


Du könntest dir die WideString-Varianten nehmen und müßtest unter Win64 die Register anpassen.
Unter 32 Bit lagen die ersten Parameter in EAX, EDX, ECX, welche aber bei 64 Bit nun anders vereilt sind. Irgenwo wurde das hier, in der DP, vor Kurzem mal erwähnt.

Für den Anfang also einfach nur die entsprechenden 32-Bit-Register der 64-Bit-Architektur verwenden.


Wenn ich mal die Zeit finde, läßt sich dann bestimmt noch einiges Optimieren. (mit MMX, SSE und Co.)
ASM Parameter:

Zitat:
The first four parameters to inline assembler functions are passed via RCX, RDX, R8, and R9 respectively, except for floating-point arguments which use XMMO, XMM1, XMM2, XMM3. The math coprocessor is not normally used from x64 code. Registers used for function parameters can be modified freely.
Lars
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 12:30
Warum das ganze überhaupt in Assembler? Das (die Quelle) sieht mir so aus als ob da "Assembler ist immer schneller als Pascal Code" gedacht wurde. Und dann auch noch "repnz scasb", was zu 80386-er Zeiten "relativ" schnell war aber mittlerweile besser mit einer loop gemacht wird.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 13:00
Eine Nicht-Assmbler-Version könnte wohl so aussehn: (ungetestet)
Delphi-Quellcode:
function CountString(const SubStr, S: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  i := 0;
  while True do begin
    i := PosEx(SubStr, S, i + 1);
    if i = 0 then Exit;
    Inc(Result);
  end;
end;
eventuell auch so:
(weiß grade nicht, wie genau gezählt wurde ... ist/war CountString('xxx', 'xxxxxx') = 2 oder 4? )
Delphi-Quellcode:
function CountString(const SubStr, S: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  i := 1;
  while True do begin
    i := PosEx(SubStr, S, i);
    if i = 0 then Exit;
    Inc(i, Length(SubStr));
    Inc(Result);
  end;
end;
$2B or not $2B

Geändert von himitsu (21. Sep 2011 um 13:04 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 15:12
Himiiii! "while true" und "Exit" - wo komms du denn her?

Delphi-Quellcode:
function CountString(const SubStr, S: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  i := 0;
  repeat
    i := PosEx(SubStr, S, i + 1);
    if i > 0 then
      Inc(Result);
    // oder
    Inc(Result, IfThen(Result>0, 1, 0));
    // Könnte nur langsamer sein
  until i = 0;
end;
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (21. Sep 2011 um 15:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#7

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 15:14
Müsste i nicht vor der Schleife mit 0 initialisiert werden?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 15:19
Ups
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 16:07
Einfacher/Optimierter Code?
Das True und den Jump-Befehl sollte Delphi auch noch wegoptimieren.

Das Exit ist eigentlich ein Break, aber da hier nichts mehr nach der Schleife kommt...

PS:
siehe FastMM, EurekaLog, GNU gettext, FastReport, PgDAC, TMS Workflow, SynEdit, JCL und Delphi VCL ... überall findet man while true do
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: XE2 Stringfunktion + ASM code : function CountString(...)

  Alt 21. Sep 2011, 16:56
Das ist zur Optimierung auch manchmal sinnvoll (wenn denn die Funktion wirklich so wichtig ist was die Geschwindigkeit angeht).

Aber das Exit in einer Zeile mit dem if zu verstecken ist richtig unsaubere Formatierung... Sorry, aber ist so...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:16 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