![]() |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
@Uwe,
mir scheint der Compiler kennt die Feder das Autors und meint es gut mit ihm :stupid: Nungut, W64 kann ich dir und CodeZwerg (warum auch immer) auf deinen Pay-Compiler wohl nicht abgraben! Beim W32 scheint er nun doch auf deiner Seite fremd zugehen.. @Harry deine Anregung wäre eine weiter Challange -> neues Thema, jodoch sehr leicht. Dieses Thema hier könnte mann auch noch um eine caseinsensitive Suche aufbohren oder so.. @CodeZwerg, wie schauts mit den Benchmarks auf deiner Seite aus?? |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Alternativ eine TList<Integer> füllen und über ToArray in ein Array umwandeln. Man kann natürlich auch erstmal das Array mit Length(S) anlegen, wenn Speicher keine Rolle spielt. |
AW: Anzahl eines Zeichens im String ermitteln
Da ich eure Sourcen nicht kompilieren kann werde ich meinen Eigenen Benchmark erweitern und bald hier vorstellen.
Geplant ist eine GUI mit einstellbarer Datenmenge, Anzahl von Wiederholungen, Einzeltests<>Multitests. Eine Idee um Schwankungen auszugleichen habe ich auch schon, was haltet ihr davon? Idee: LastNano und CurrNano hält Zeitwerte des letzten und aktuellen Vorgangs, bei neuem Durchgang wird die Differenz von Last und Curr extrahiert, geteilt und der Restwert zugerechnet/abgezogen (je nach dem). Wäre das legitim um einen guten Durchschnittswert zu erhalten? Eine "AddPosArray" funktionalität für Harry werde ich bei meiner Lieblingsfunktion von Uwe integrieren. Von Egon hab ich nur zwei Varianten, ich lade mir den letzten Eurer Sourcen und nehme alles mit rein. Als Ergebnis wird die Liste als Rangfolge dann angezeigt. |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Die Assemblervariante scheitert unter 64-Bit doch nur an dem Unterschied edi <> rdi. Sprich so funktioniert diese unter beidem:
Delphi-Quellcode:
Unter 64-Bit sieht das Ergebnis bei mir dann so aus:
function CharCountAsm(AStr: PChar; AChar: Char; len: Integer): Integer;
label loop_start, loop_ende, ende; asm {$ifdef cpux86} push edi {$else} push rdi {$endif} cld {$ifdef cpux86} mov edi, AStr {$else} mov rdi, AStr {$endif} mov ax, AChar mov ecx, len xor edx, edx loop_start: repnz scasw jecxz loop_ende inc edx jmp loop_start loop_ende: jnz ende inc edx ende: mov result, edx {$ifdef cpux86} pop edi {$else} pop rdi {$endif} end; Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Dann möchte ich meine schnell zusammengeschrieben Assembler-Rountine auch noch ins Rennen werfen.
Delphi-Quellcode:
function AH_CharCountAsm(const S: string; Ch: Char): Cardinal;
asm {$IFNDEF CPUX64} test eax, eax jz @@Empty // wenn S = '' dann gibt es nichts zu tun push ebx push esi mov esi, eax xor eax, eax xor ebx, ebx // Stringlänge ermitteln //mov ecx, DWORD PTR [esi-skew].StrRec.Length mov ecx, DWORD PTR [esi-$04] // ESI auf das String-Ende zeigen lassen und ECX negieren damit ESI+ECX*2 das erste Zeichen ergibt lea esi, [esi+ecx*2] neg ecx @@Loop: cmp WORD PTR [esi+ecx*2], dx sete bl add eax, ebx inc ecx jnz @@Loop pop esi pop ebx @@Empty: {$ELSE} xor rax, rax // Rückgabewert auf 0 setzen test rcx, rcx jz @@Empty // wenn S = '' dann gibt es nichts zu tun mov r8, rcx xor ecx, ecx // Stringlänge ermitteln //movsxd r9, DWORD PTR [r8-skew].StrRec.Length movsxd r9, DWORD PTR [r8-$04] // R9 auf das String-Ende zeigen lassen und R9 negieren damit R8+R9*2 das erste Zeichen ergibt lea r8, [r8+r9*2] neg r9 @@Loop: cmp WORD PTR [r8+r9*2], dx sete cl add eax, ecx inc r9 jnz @@Loop @@Empty: {$ENDIF ~CPUX64} end;
Code:
00000 Calibrate
03237 1234588 miep 05421 Ydobon 02629 marabu 03317 Missionar 03232 alzaimar 02661 Uwe Raabe StringCountChar 02629 Uwe Raabe StringCountCharFor 02144 KodeZwerg CountCharInString 07170 KodeZwerg CharInStringA 03498 Neutral General CharCountAsm 01993 Uwe Raabe CharCount 01772 Andreas Hauladen CharCountAsm ***** 02696 Egon Hugeist CharCount_1 03242 Egon Hugeist CharCount_2 02556 Egon Hugeist CharCount_Double_Sided_3 02681 Egon Hugeist CharCount_Double_Sided_4 03318 Delphi CountChar |
AW: Anzahl eines Zeichens im String ermitteln
Danke für weiteren (ASM) Methoden, werde ich mit einbauen, ich fange jetzt mal an Delphi anzukurbeln, kann sein das morgen erst fertig, ich wills diesmal Gründlich machen und nicht nur huschi-wuschi wie die initial-Version.
@Harry, sag oder PN mir Deine Lieblingsmethode für AddPosArray funktionalität. Da ich nichts Cross-Entwickle fehlt mir da die Erfahrung was klappt und was nicht. @EWeiss, ich hab das ASM aus einer CodeLib heraus gehabt, ich glaub von den Schweizern (die langsame ASM version) und ich kann mich den anderen nur anschließen, just for fun. Was mich immer noch bei all Euren Resultaten sowas von vom Hocker haut ist wie schlecht D2009 mit der Ydobon Methode performt. Wenn ich neue Version hoch habe würde ich gerne mal das Ergebnis da sehen, mit meinem D2009 Kompilat bin ich bei Werten * 100000 oder so alle anderen Ergebnisse sind relativ gleich, kommt halt viel auf Processor-Architektur und dessen Pro-MHz Leistung an (sowie eventuelle Chipsatz-Features?). |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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