AW: Anzahl eines Zeichens im String ermitteln
Oh Mist du hast Recht. Das ist das Problem :wall:
Bei jcxz springt er je nachdem wo er gerade ist zu früh raus. :roll: :wall: Danke! Da war ich etwas blind.. Wusste nicht dass man esi/edi sichern muss. Hab grad nachgeguckt und du hast Recht. Hab die Funktion angepasst:
Delphi-Quellcode:
function CharCountAsm(AStr: PChar; AChar: Char; len: Integer): Integer;
label loop_start, loop_ende, ende; asm push edi cld mov edi, AStr 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 pop edi end; |
AW: Anzahl eines Zeichens im String ermitteln
Mit Post 91 klappt es nun ohne EA. Ich weiß auch nicht wo ich vorhin stecken geblieben bin, tut mir leid für Verwirrung. Bei Bedarf kann ich aktuelle Version mit den zwei neuen Ankömmlingen hochladen.
Die Asm Variante reiht sich bei mir so in etwa wie die AnsiStrScan() Methode ein. Bei der "von-Vorne-und-Hinten" die EgonHugeist schrieb ist kein merklicher Zugewinn spürbar, habs testhalber mit 500MB paar mal durch, das nimmt sich nichts mit Deiner vorigen Methode. Was mich total verwirrt ist allerdings das Ydobon/StringReplace Ergebnis bei Uwe, also da hat Tokyo (falls es das war bei Dir) einen gigantischen Schritt vollbracht. Wenn ich diese Variante mit einem halben Megabyte aufrufe kann ich erstmal an Briefkasten Post holen, vielleicht ist es fertig wenn ich wieder da bin. Deshalb habe ich es rauskommentiert. Mit anderen Worten bei mir hat es bei der Zeitmessung mindestens Deinen Wert * 10000 wenn nicht gar * 1000000. Kein Scherz. Ich kann ja mal mit 50MB ein Kompilat hochladen wo das auch gebencht wird, dann seht ihr was ich meine. (Kann sein das die berechnung morgen erst fertig ist) |
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Wegen der Performance: Habe mir Uwes Test mit XE10.2-Starter compiliert und meine 2 weiteren Version hinzugefügt. Zitat:
Zitat:
kannst du das bestätigen? Mir gehen die 30% Performance-Verlust bei meiner Variante 1 ab. Wo sind sie denn hin? Spielt der Compiler Streiche? Habt ihr andere Ergebnisse? |
AW: Anzahl eines Zeichens im String ermitteln
Zum Spaß:
Delphi-Quellcode:
Results mit Uwes test:
function EH_CharCount_4(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))^-1; if PEnd = p //handle single char string then Inc(Result, Ord(P^ = C)) else while P < PEnd do begin Inc(Result, Ord(P^ = C)); Inc(P); if PEnd >= P then begin Inc(Result, Ord(PEnd^ = C)); Dec(PEnd); end; end; end; (Run 1) Zitat:
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Jetzt wird's aber interessant! Hier mal die Laufzeiten für Win64 (die ASM-Funktion fällt da logischerweise raus):
Zitat:
Delphi-Quellcode:
während die normale For-Schleife nicht so stark einbricht
Result := 0;
for Ch in S do begin Inc(Result, Ord(Ch = C)); end;
Delphi-Quellcode:
Die CharCount scheint allerdings vom 64-Bit Compiler zu profitieren.
Result := 0;
for I := Low(S) to High(S) do begin Inc(Result, Ord(S[I] = C)); end; |
AW: Anzahl eines Zeichens im String ermitteln
ich weis jetzt nicht was ihr eigentlich erreichen wollt.
http://www.delphigroups.info/2/ed/443666.html Google spuckt zig varianten von StrScan aus sollte man die jetzt alle einem Benchmark unterwerfen? KodeZwerg variante ist die erste.. Anscheinend soll die zweite schneller sein. gruss |
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
|
AW: Anzahl eines Zeichens im String ermitteln
Zitat:
Uwe ich hätte 'ne Kiste Wein gewettet, ich gewinne. Zitat: "Again what learned". Hu nicht gewettet, puhh! Ist wirklich interessant! Sei so fair und füge meine letzte version hinzu, bitte. Macht XE10.2-Starter(32-Bit) wat anders? Ich glaube es nicht.. Wenn ich über neuere CPU's so nachdenke(die alten sterben alle :-D) -> die Challange geht an dich, congrats! :thumb: Darf man fragen auf was für einer CPU/OS-Version du da reitest? Mein 5-6 Jahre alter Laptop wackelt mit 'nem i7-3610QM, 2,3GHZ, 32GB-RAM on W10 Schaut so aus, als ob ich beginnen muß den Profilern zu trauen, während ich immer Profiler war... Bei dem code, wie geschrieben denk ich nicht mal mehr nach -> thank's 4the lesson! Gruß, Michael |
AW: Anzahl eines Zeichens im String ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Für mich habe ich die Erkenntnis mitgenommen, daß ich mit der eingebauten Funktion im StringHelper am besten zurecht komme. Die ist bei akzeptabler Performance überall und für alle Plattformen verfügbar, ohne daß ich jedesmal eine Utility-Unit einbinden muss (und irgendwie im VCS verwalten muss). Da zählen andere Kriterien mehr als ein nur marginaler Performancevorteil. Anbei noch der letzte Softwarestand. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 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