Autor |
Beitrag |
sky21
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Do 30.04.09 11:23
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Do 30.04.09 12:20
Zuletzt bearbeitet von thepaine91 am Do 30.04.09 12:50, insgesamt 1-mal bearbeitet
|
|
JayEff
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 30.04.09 12:27
Gefällt mir aus verschiedensten Gründen absolut nicht.
Warum ist Suchstring ein Var-Parameter, warum wird mein ursprünglicher String verändert, kann das auch nur im entferntesten Sinnvoll sein?
Mal ausprobiert: Es ist unendlich langsam, was auch kein Wunder ist, da es ja Elemente aus dem String löscht, wodurch der komplette String hin- und herkopiert werden muss.
... Ok, ich breche meinen ursprünglichen Test ab, 50000 Durchgänge dauern bei mir mehr als 1 Minute.
... 5000 Durchgänge. 22,6 Sekunden (!), im Vergleich dazu
Delphi-Quelltext 1: 2: 3:
| for i := 1 to Length(s) do if s[i] = ' ' then inc(m1); |
ebenfalls 5000 Durchgänge dauerte 47 ms (!)
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Do 30.04.09 12:34
Das kommt noch aus anfangszeiten meiner Programmierung war nur copy paste ^^
Das deine so viel schneller ist wundert mich dann auch nicht ^^
Aber ich editier sie mal so das es sinnvoll ist
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function TForm1.SubstringFinden(const Text, Suchstring: String): integer; var i, Anzahl: integer; begin Anzahl := 0; for i := 1 to length(Text) - length(Suchstring) +1 do if copy(Text, i, length(Suchstring)) = Suchstring then inc(Anzahl); Result := Anzahl Result:= 0; .... then inc(Result); end; |
Zuletzt bearbeitet von thepaine91 am Do 30.04.09 13:02, insgesamt 1-mal bearbeitet
|
|
JayEff
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 30.04.09 12:55
thepaine91 hat folgendes geschrieben : | Das kommt noch aus anfangszeiten meiner Programmierung war nur copy paste ^^
Das deine so viel schneller ist wundert mich dann auch nicht ^^
Aber ich editier sie mal so das es sinnvoll ist |
Deine Funktion arbeitet halt mit einem Suchstring während meine nur einen Char sucht. Wenn's um Strings geht, funktioniert das nicht so einfach. In ADA könnte man einfach die Grenze des Strings als Slice angeben... Aus s(1 .. 5) = 'hallo' wird s(4 .. 5) = 'o', das ist recht schnell. In Delphi gibt es soweit ich weiß auch slices aber ich weiß nicht, wie das geht.
Deine neue Methode brauchte im Test nur 4,4 Sekunden, schon viel besser Optimieren lässt es sich sicherlich mit PosEx... Ich probier mal was
Edit: Result := Anzahl; vergessen
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 30.04.09 13:00
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Do 30.04.09 13:03
Hm ich guck auch mal wenn ich Zeit hab ob ich was finde und er wollte das ja garnicht mit strings wo du es sagst
|
|
JayEff
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 30.04.09 13:08
Auf 93 ms komme ich mit
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function SubstringFinden(Text, Suchstring: String): integer; var i, Anzahl: integer; begin Anzahl := 0; i := Pos(SuchString, Text); while i > 0 do begin inc(Anzahl); i := PosEx(Suchstring, Text, i + Length(SuchString)); end; Result := Anzahl; end; |
und mit BenBEs nicht ganz ernst gemeinter Funktion kommt man auf 26 Sekunden
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Do 30.04.09 13:12
Puhh 93 ms..... geht das nicht schneller ? -.- Ich mein für so ein bisschen String suche will ich ja nicht gleich meinen ganzen Tag vergeuden. Und wenn du hier schon Messwerte raushaust dann bitte auch deine Systemleistung. ^^ Ansonsten kann man damit nix anfangn.
|
|
JayEff
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 30.04.09 13:30
thepaine91 hat folgendes geschrieben : | Puhh 93 ms..... geht das nicht schneller ? |
für 5000 Durchgänge eines 3720 Zeichen langen Strings. 2,2GHz (dualcore, wird ja nur 1 genutzt)
Gern geschehen, übrigens, ich brauch atm keine Stringsuche aber für so freundliche Antworten arbeite ich auch mal gern kostenlos
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Do 30.04.09 13:42
jayeff liegt an meinem seltsamen Humor. War nicht ernst gemeint. Super Lösung
Außer das mit der Systemleistung ist immer ganz nett zu wissen damit man es wenigstens ein bissel einschätzen kann.
Und ben be deine nicht ganz ernst gemeinte lösung bietet mir nicht ganz richtige Ergebnise
|
|
JayEff
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 30.04.09 14:14
thepaine91 hat folgendes geschrieben : | jayeff liegt an meinem seltsamen Humor. War nicht ernst gemeint. Super Lösung |
Jaaa das hab ich zuerst eig auch gedacht... komisch, dass ich das dann trotzdem nochmal uminterpretiert hab
Nix für ungut
Ich hab meine Werte eigentlich nur zum Vergleichen angegeben.
Edit: Bei meinem Test funktionierte Ben's Funktion mit Chars, aber die mit Strings ist falsch. Man muss das Endergebniss noch durch die Suchstring-Länge teilen =P
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Do 30.04.09 14:51
das erklärt einiges...
BenBe auch wenn es nicht die effektivste Lösung ist immerhin ein einzeiler
und ehrlich gesagt hab ich keine Ahnung was du da machst war auch zu faul die Delphi Hilfe durchzulesen. ^^
Und die für Strings dann eben so
Delphi-Quelltext 1: 2: 3: 4:
| function CountNonOverlappingStr(Haystack: String; Needle: String): Integer; begin Result := (Length(Haystack) - Length(StringReplace(Haystack, Needle, '',[rfReplaceAll])))div length(Needle); end; |
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 30.04.09 15:08
thepaine91 hat folgendes geschrieben : | und ehrlich gesagt hab ich keine Ahnung was du da machst war auch zu faul die Delphi Hilfe durchzulesen. ^^ |
Naja, was wird StringReplace schon machen? Richtig: Einen String durch einen anderen ersetzen.
Er ersetzt einfach alle Vorkommen des gesuchten Strings durch '', löscht diese also. Die Differenz aus der Länge vorher und des Strings ohne diese Teile des Strings ist dann die Anzahl der Buchstaben damit. Und geteilt durch die Länge des gesuchten Strings ist das dann dessen Anzahl.
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 30.04.09 15:18
jaenicke hat folgendes geschrieben : | Er ersetzt einfach alle Vorkommen des gesuchten Strings durch '', löscht diese also. Die Differenz aus der Länge vorher und des Strings ohne diese Teile des Strings ist dann die Anzahl der Buchstaben damit. Und geteilt durch die Länge des gesuchten Strings ist das dann dessen Anzahl. |
Erinnert mich irgendwie an die Frage, wie Mathematiker Elefanten fangen:
Zitat: |
Mathematiker fangen Elefanten, indem sie nach Afrika gehen, alles entfernen, was nicht Elefant ist und ein Element der Restmenge fangen. |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
sky21
Beiträge: 141
W7
D2010, XE2
|
Verfasst: Do 30.04.09 15:36
Hey danke für die vielen Beiträge hier! Mittlerweile habe ich es auch selber implementiert und präsentiere meine Version hier: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function GetNumberOfChars(const sInput : string; const chrSearch : char) : Integer; var i : Integer;
begin Result := 0; for i:=1 to Length(sInput) do if (sInput[i] = chrSearch) then Inc(Result); end; |
|
|
thepaine91
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mo 04.05.09 12:38
Mal eine Frage @jeanicke welche Delphi version benutzt du? Ich finde leider kein PosEx.
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Mo 04.05.09 13:17
thepaine91 hat folgendes geschrieben : | Mal eine Frage @jeanicke welche Delphi version benutzt du? Ich finde leider kein PosEx. |
Hast Du StrUtils eingebunden?
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 04.05.09 13:46
Und für Delphi 5 oder früher gibts hier einen Ersatz:
www.delphipraxis.net/post409954.html
|
|
espen
Beiträge: 90
Erhaltene Danke: 1
D6 Prof./D7 Prof. MSSQL, MySQL
|
Verfasst: Mo 04.05.09 14:11
Hallo,
ich glaube meine Version ist etwas schneller
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| function GetNumberOfChars(const aString : String; const aChar : Char) : Integer; var FCount : integer; FFind : Integer; begin FCount := 0; FFind := ord(aChar); asm mov eax, aString mov ecx, FCount @CNT: inc eax movzx edx, byte [eax] cmp edx, FFind jne @NXT inc ecx @NXT: cmp edx, 0 jne @CNT mov FCount, ecx end; Result := FCount; end; |
Gruss.
|
|
|