![]() |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Zitat:
Surrogate selber kann man aber nicht suchen, bzw. eben nur einzeln nach den beiden Hälften. |
AW: Anzahl eines Zeichens im String ermitteln
@Uwe
Schaut gut aus! No a bizzl kürzer:
Delphi-Quellcode:
function CharCount(const S: string; C: Char): Cardinal;
var P, PEnd: PChar; begin Result := 0; P := Pointer(S); if P = nil then Exit; PEnd := P + PLongInt(NativeUInt(P) - SizeOf(LongInt))^; while P < PEnd do begin Inc(Result, Ord(P^ = C)); Inc(P); end; end; |
AW: Anzahl eines Zeichens im String ermitteln
Ein gutes Beispiel für Codes, die in 64 Bit gnadenlos abrauchen.
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Edit:
Code:
function CharCount(const S: string; C: Char): Cardinal;
var P, PEnd: PChar; begin Result := 0; P := Pointer(S); if P = nil then Exit; {$IFNDEF FPC} PEnd := P + PLongInt(NativeUInt(P) - SizeOf(LongInt))^; {$ELSE} PEnd := P + PSizeInt(NativeUInt(P) - SizeOf(SizeInt))^; {$ENDIF} while P < PEnd do begin Inc(Result, Ord(P^ = C)); Inc(P); end; end; |
AW: Anzahl eines Zeichens im String ermitteln
Ich poste meine Assembler Version einfach mal.
Delphi-Quellcode:
Damit erreiche ich momentan den 2. Platz im Benchmark (CountCharInString gewinnt).
function CharCountAsm(AStr: PChar { eax }; AChar: Char { dx }; len: Integer { ecx }): Integer;
label loop_start, loop_ende, ende; asm // Danke gammatester! - sorgt dafür dass scasw vorwärts und nicht rückwärts sucht cld // edi + ax für scasw initialisieren mov edi, eax mov ax, dx // edx = char count := 0 xor edx, edx loop_start: repnz scasw // bis zum nächsten Vorkommen "vorspulen" jcxz loop_ende // Wenn String zu Ende, aus Schleife springen inc edx // Vorkommen des Chars mitzählen jmp loop_start loop_ende: jnz ende inc edx // Falls der letzte Buchstabe noch ein Treffer war ende: mov result, edx end; i := CharCountAsm(@Data[1], 'X', Length(Data)); ACHTUNG: Da scheint auch noch irgendwo ein kleiner Denkfehler drin zu sein :!: In (relativ) seltenen Fällen zählt mein Code aus irgendeinem Grund falsch. Falls jemand eine Idee hat wo der Fehler ist oder wie man den Code generell noch verbessern/verschnellern kann wäre das super! 64-Bit ginge natürlich auch, aber habe wenig Erfahrung mit 64 Bit Assembler, deswegen lasse ichs erst mal. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Delphi-Quellcode:
ist da auch nicht viel schlechter (ca. 50% länger als mein letzter Ansatz und ca. 20% länger als dein Vorschlag).
S.CountChar(C)
Offenbar sind die Ansätze mit PChar und Inc(P) potentiell schneller als indizierte Zugriffe in For-Schleifen. Ob der erreichbare Geschwindigkeitsgewinn aber die schlechtere Lesbarkeit und Wartbarkeit (siehe die ganzen Probleme mit Assembler) rechtfertigt, ist wohl eher zweifelhaft. Ich habe den Benchmark etwas modifiziert und rufe die einzelnen Probanden 10000x auf um lokale Schwankungen auszugleichen - natürlich außerhalb der IDE und im Release-Mode. Messungen im Nanosekundenbereich sind einfach nicht verlässlich genug. Da der String per Zufall generiert wird, kann man verschiedene Läufe auch nicht direkt miteinander vergleichen, nur die Rangfolge innerhalb eines Laufs. Der Zeichensatz ist ja auch etwas eingeschränkt gewählt. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 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