![]() |
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für für den letzten Stand.
Ich denke du hast recht. Simples Ausschlusverfahren: Ich habe mal mein XE10.2-W32 Compilate (release) angehängt. Wenn deine Version immernoch die schnellste mit der EXE ist, dann ist der Compiler ausgeschlossen und da macht deine Hardware einen guten Job. Bei mir sehen die Ergebnisse (minimale Schwankungen im >5% ) ziehmlich gleich aus. YFI: Zitat:
Ich persönlich tendiere immer dazu ein set von function zu sammeln und diese Wiederzubenutzen.. |
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Double Post. Hab sind noch zwei:
mit direktem Inc des Boolschen ordinals:
Delphi-Quellcode:
ohne direktem Inc des Boolschen ordinals mit if ? then
function EH_CharCount_5(const S: string; C: Char): Cardinal;
var P, PEnd: PChar; begin Result := 0; P := Pointer(S); if P = nil then Exit; PEnd := P + PStrLenInt(NativeUInt(P) - SizeOf(StrLenInt))^-8; while P < PEnd do begin //comapre 8 Chars per loop //this is a simple technic to reduce the loop. Inc(Result, Ord(P^=C)); Inc(Result, Ord((P+1)^=C)); Inc(Result, Ord((P+2)^=C)); Inc(Result, Ord((P+3)^=C)); Inc(Result, Ord((P+4)^=C)); Inc(Result, Ord((P+5)^=C)); Inc(Result, Ord((P+6)^=C)); Inc(Result, Ord((P+7)^=C)); Inc(P, 8); end; Inc(PEnd, 8); while P < PEnd do begin Inc(Result, Ord(P^=C)); Inc(P); end; end;
Delphi-Quellcode:
Dies ist die eine typische Technik um die Loops zu reduzieren. Man kann das noch weiter aufbohren für seeehhhr lange strings.
function EH_CharCount_6(const S: string; C: Char): Cardinal;
var P, PEnd: PChar; begin Result := 0; P := Pointer(S); if P = nil then Exit; PEnd := P + PStrLenInt(NativeUInt(P) - SizeOf(StrLenInt))^-8; while P < PEnd do begin //comapre 8 Chars per loop //this is a simple technic to reduce the loop. if P^ = C then Inc(Result); if (P+1)^ = C then Inc(Result); if (P+2)^ = C then Inc(Result); if (P+3)^ = C then Inc(Result); if (P+4)^ = C then Inc(Result); if (P+5)^ = C then Inc(Result); if (P+6)^ = C then Inc(Result); if (P+7)^ = C then Inc(Result); Inc(P, 8); end; Inc(PEnd, 8); while P < PEnd do begin if P^=C then Inc(Result); Inc(P); end; end; Bei mir rockt EH_CharCount_5 am schnellsten: Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Zitat:
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Also ich finde die ganzen Varianten höchst interessant und man erfährt dabei ein wenig, wo typische bottlenecks sitzen.:thumb:
String.CountChar kannte ich nicht, also insofern wieder was nützliches dazugelernt (hatte dafür nur eine eigene Funktion). Cool wäre auch, eine Funktion zu haben, welche nicht nur die Anzahl der Vorkommen des Chars ermittelt, sondern auch noch deren Position z.B. in einem Array zurück gibt. Das könnte auch noch an verschiedenen Stellen hilfreich sein. Eine fertige Funktion scheint es da aber nicht zu geben, oder (String.split habe ich gesehen, gibt aber ein Array der Teilstrings zurück, ich wäre aber erst mal nur an den Positionen des gesuchten Chars interessiert)? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Die hiesigen Ergebnisse für Win32: Zitat:
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Um es selber nachvollziehen zu können: Wie ist denn
PStrLenInt definiert? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
type
//zentral deklariert PStrLenInt = ^StrLenInt; StrLenInt = {$IFDEF FPC}SizeInt{$ELSE}LongInt{$ENDIF}; |
AW: Anzahl eines Zeichens im String ermitteln
OK, Danke Uwe.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 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