AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Anzahl eines Zeichens im String ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Anzahl eines Zeichens im String ermitteln

Ein Thema von DevidEspenschied · begonnen am 27. Jun 2008 · letzter Beitrag vom 17. Jul 2018
Antwort Antwort
Seite 10 von 16   « Erste     8910 1112     Letzte »    
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#91

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 16:06
Oh Mist du hast Recht. Das ist das Problem
Bei jcxz springt er je nachdem wo er gerade ist zu früh raus.

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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#92

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 16:33
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)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#93

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 17:13
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.
War auch nicht der Zweck. Es ging um die ursprüngliche Frage un das aufweisen verschiedener Varianten.

Wegen der Performance:
Habe mir Uwes Test mit XE10.2-Starter compiliert und meine 2 weiteren Version hinzugefügt.
Zitat:
Starting Benchmark, please be patient...
KodeZwerg's custom Benchmark - DP CountCharInString Edition
Result := 7982

Calibrate - Target missed: 0 <> 7982
00000 Calibrate
04872 1234588 miep
07772 Ydobon
04088 marabu
05025 Missionar
04432 alzaimar
04273 Uwe Raabe StringCountChar
04059 Uwe Raabe StringCountCharFor
04038 KodeZwerg CountCharInString
09867 KodeZwerg CharInStringA
04543 Neutral General CharCountAsm
04378 Uwe Raabe CharCount
04018 Egon Hugeist CharCount_1
04455 Egon Hugeist CharCount_2
04535 Egon Hugeist CharCount_Double_Sided
04671 Delphi CountChar
Benchmark finished!
2. Run:
Zitat:
Starting Benchmark, please be patient...
KodeZwerg's custom Benchmark - DP CountCharInString Edition
Result := 7982

Calibrate - Target missed: 0 <> 7982
00000 Calibrate
04806 1234588 miep
07723 Ydobon
04048 marabu
05072 Missionar
04646 alzaimar
04277 Uwe Raabe StringCountChar
04317 Uwe Raabe StringCountCharFor
04064 KodeZwerg CountCharInString
10165 KodeZwerg CharInStringA
04541 Neutral General CharCountAsm
04364 Uwe Raabe CharCount
03997 Egon Hugeist CharCount_1
04501 Egon Hugeist CharCount_2
04523 Egon Hugeist CharCount_Double_Sided
04656 Delphi CountChar
Benchmark finished!
@Uwe
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?
Angehängte Dateien
Dateityp: zip CountCharBenchmark.Form.zip (2,5 KB, 5x aufgerufen)

Geändert von EgonHugeist (13. Jul 2018 um 17:16 Uhr)
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#94

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 17:32
Zum Spaß:
Delphi-Quellcode:
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;
Results mit Uwes test:
(Run 1)
Zitat:
Starting Benchmark, please be patient...
KodeZwerg's custom Benchmark - DP CountCharInString Edition
Result := 7982

Calibrate - Target missed: 0 <> 7982
00000 Calibrate
04905 1234588 miep
08639 Ydobon
04217 marabu
05136 Missionar
04639 alzaimar
04337 Uwe Raabe StringCountChar
04164 Uwe Raabe StringCountCharFor
04061 KodeZwerg CountCharInString
10075 KodeZwerg CharInStringA
04451 Neutral General CharCountAsm
04301 Uwe Raabe CharCount
03949 Egon Hugeist CharCount_1
04398 Egon Hugeist CharCount_2
04485 Egon Hugeist CharCount_Double_Sided
03702 Egon Hugeist CharCount_Double_Sided_2
04578 Delphi CountChar
Benchmark finished!
(Run 2)
Zitat:
Starting Benchmark, please be patient...
KodeZwerg's custom Benchmark - DP CountCharInString Edition
Result := 7982

Calibrate - Target missed: 0 <> 7982
00000 Calibrate
04865 1234588 miep
07914 Ydobon
04114 marabu
05044 Missionar
04479 alzaimar
04317 Uwe Raabe StringCountChar
04125 Uwe Raabe StringCountCharFor
04158 KodeZwerg CountCharInString
10157 KodeZwerg CharInStringA
04583 Neutral General CharCountAsm
04390 Uwe Raabe CharCount
03953 Egon Hugeist CharCount_1
04431 Egon Hugeist CharCount_2
04505 Egon Hugeist CharCount_Double_Sided
03740 Egon Hugeist CharCount_Double_Sided_2
04597 Delphi CountChar
Benchmark finished!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#95

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 17:51
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?
Hier meine Ergebnisse, wobei die korrigierte Assembler-Lösung da schon einfließt. Erklären kann ich mir den Unterschied zwischen EH1 und EH2 aber auch nicht. Der erzeugte Code ist offenbar bei EH1 effizienter.

Zitat:
00000 Calibrate
03536 1234588 miep
05918 Ydobon
02947 marabu
03771 Missionar
03686 alzaimar
03013 Uwe Raabe StringCountChar
03079 Uwe Raabe StringCountCharFor
02607 KodeZwerg CountCharInString
06959 KodeZwerg CharInStringA
04000 Neutral General CharCountAsm
02734 Uwe Raabe CharCount
03120 Egon Hugeist CharCount_1
03675 Egon Hugeist CharCount_2
02814 Egon Hugeist CharCount_Double_Sided
03715 Delphi CountChar
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#96

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 18:10
Jetzt wird's aber interessant! Hier mal die Laufzeiten für Win64 (die ASM-Funktion fällt da logischerweise raus):
Zitat:
00000 Calibrate
03719 1234588 miep
07360 Ydobon
03548 marabu
04122 Missionar
03711 alzaimar
08399 Uwe Raabe StringCountChar
03597 Uwe Raabe StringCountCharFor
02869 KodeZwerg CountCharInString
07099 KodeZwerg CharInStringA
Neutral General CharCountAsm - Target missed: 0 <> 7982
00000 Neutral General CharCountAsm
02183 Uwe Raabe CharCount
03043 Egon Hugeist CharCount_1
03678 Egon Hugeist CharCount_2
02816 Egon Hugeist CharCount_Double_Sided
04076 Delphi CountChar
Der große Verlierer ist hier erstaunlicherweise StringCountChar
Delphi-Quellcode:
  Result := 0;
  for Ch in S do begin
    Inc(Result, Ord(Ch = C));
  end;
während die normale For-Schleife nicht so stark einbricht
Delphi-Quellcode:
  Result := 0;
  for I := Low(S) to High(S) do begin
    Inc(Result, Ord(S[I] = C));
  end;
Die CharCount scheint allerdings vom 64-Bit Compiler zu profitieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#97

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 18:17
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

Geändert von EWeiss (13. Jul 2018 um 18:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#98

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 18:21
ich weis jetzt nicht was ihr eigentlich erreichen wollt.
Gar nichts
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EgonHugeist

Registriert seit: 17. Sep 2011
187 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#99

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 18:35
ich weis jetzt nicht was ihr eigentlich erreichen wollt.
Gar nichts
So ist es! Spotrlicher Ehrgeiz, mehr ist das nicht.

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 ) -> die Challange geht an dich, congrats!

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

Geändert von EgonHugeist (13. Jul 2018 um 18:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#100

AW: Anzahl eines Zeichens im String ermitteln

  Alt 13. Jul 2018, 19:50
Ist wirklich interessant! Sei so fair und füge meine letzte version hinzu, bitte.
Einmal für Win32:
Zitat:
00000 Calibrate
03567 1234588 miep
05984 Ydobon
02945 marabu
03678 Missionar
03604 alzaimar
03013 Uwe Raabe StringCountChar
02998 Uwe Raabe StringCountCharFor
02687 KodeZwerg CountCharInString
07023 KodeZwerg CharInStringA
04072 Neutral General CharCountAsm
02814 Uwe Raabe CharCount
03057 Egon Hugeist CharCount_1
03751 Egon Hugeist CharCount_2
02899 Egon Hugeist CharCount_Double_Sided_3
02958 Egon Hugeist CharCount_Double_Sided_4
03822 Delphi CountChar
und nochmal für Win64:
Zitat:
00000 Calibrate
03777 1234588 miep
07545 Ydobon
03719 marabu
04292 Missionar
03759 alzaimar
08473 Uwe Raabe StringCountChar
03763 Uwe Raabe StringCountCharFor
02921 KodeZwerg CountCharInString
07238 KodeZwerg CharInStringA
Neutral General CharCountAsm - Target missed: 0 <> 7982
00000 Neutral General CharCountAsm
02201 Uwe Raabe CharCount
03022 Egon Hugeist CharCount_1
03731 Egon Hugeist CharCount_2
02952 Egon Hugeist CharCount_Double_Sided_3
03088 Egon Hugeist CharCount_Double_Sided_4
03780 Delphi CountChar
Macht XE10.2-Starter(32-Bit) wat anders? Ich glaube es nicht..
Nein, das glaube ich auch nicht. Der Compiler sollte derselbe sein.

Darf man fragen auf was für einer CPU/OS-Version du da reitest?
i7-4790 3.6 GHz (auch schon etwas in die Jahre gekommen), 32GB RAM, Win10 x64 1709.

Bei dem code, wie geschrieben denk ich nicht mal mehr nach -> thank's 4the lesson!
Ich würde das jetzt nicht überbewerten. Viel hängt da offenbar von der Tagesform des Compilers ab und bis auf wenige Ausreißer ist das Feld doch recht dicht beisammen.

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.
Angehängte Dateien
Dateityp: zip CountCharBenchmark.zip (7,6 KB, 12x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 10 von 16   « Erste     8910 1112     Letzte »    


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 15:46 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