![]() |
Re: Wie oft ist ein Zeichen in einem String
Bei meiner könnt man nich das Result erhöhen mit Inc() machen... und evtl. PosEx statt Pos + Copy verwenden... ansonsten läuft die auch für Fragen wie "Wie oft ist
im Quelltext?" ;) |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
|
Re: Wie oft ist ein Zeichen in einem String
[quote="xZise"]
Zitat:
Zitat:
Delphi-Quellcode:
-> 7 sekunden
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer; Start: TTime; begin Start := Now; for I := 1 to 100000000 do Zeichen('abcabcabcabcabcabcabcabcabcabc', 'a'); label1.Caption := TimeToStr(Now-Start); end; |
Re: Wie oft ist ein Zeichen in einem String
Wenn du eine Geschwindigkeitsmessung durchführen willst, kannst du TTime eigentlich vergessen. Nimm lieber
![]() |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
![]() |
Re: Wie oft ist ein Zeichen in einem String
Dann muss ich doch noch einen draufsetzen.
Im Prinzip zwar das Gleiche, aber StrCharsCount zählt gleich mehrere Zeichen auf einmal.
Delphi-Quellcode:
Kopiert aus der JCL. :angel2:
function StrCharCount(const S: string; C: Char): Integer;
var I: Integer; begin Result := 0; for I := 1 to Length(S) do if S[I] = C then Inc(Result); end; function StrCharsCount(const S: string; Chars: TSysCharSet): Integer; var I: Integer; begin Result := 0; for I := 1 to Length(S) do if S[I] in Chars then Inc(Result); end; anzahl := StrCharsCount('Delphi2007', ['0'..'9']); // ergibt 4 |
Re: Wie oft ist ein Zeichen in einem String
Dem Fragesteller ist mit den Lösungen eigentlich recht wenig geholfen. Er kann sich die Funktionen kopieren aber der Lerneffekt ist fast 0
|
Re: Wie oft ist ein Zeichen in einem String
Delphi-Quellcode:
Sieger ist "Zeichen" mit etwa 140ms
procedure TForm1.Button1Click(Sender: TObject);
var s:string; i:integer; a:array[0..4] of cardinal; begin setlength(s,100000); for i:=1 to 100000 do s[i]:=chr(i mod 10 +60); memo1.Clear; a[0]:=gettickcount; for i:=1 to 1000 do Zeichen(s,'A'); a[1]:=gettickcount; for i:=1 to 1 do countsubstr('A',s); a[2]:=gettickcount; for i:=1 to 1 do bla(s,'A'); a[3]:=gettickcount; for i:=1 to 1000 do countchar(s,'A'); a[4]:=gettickcount; for i:=1 to 4 do memo1.lines.add(inttostr(a[i]-a[i-1])); end; Zweiter ist "countchar" mit etwa 200ms Dritter ist "bla" mit etwa 31ms *1000 ==>31s Vierter ist "Countsubstr" mit 953ms *1000 ==>953s Und wir haben keinen Letzten! zur Verteidigung von countsubstr muss man noch erwähnen, dass er statt Zeichen zu zählen, gleich ganze Teilstrings gezählt hat (wie ja auch der Titel sagt) (Mehr Aufwand für die Zeitrechnung wollte ich nicht treiben) |
Re: Wie oft ist ein Zeichen in einem String
Und dass ich den uralten Code wirklich langsam mal optimieren muss ;)
Edit: Okay.. ich fordere ein neues Rennen :lol: Neuer Code:
Delphi-Quellcode:
function CountSubStr(SubStr, Str: string): integer;
var Offset: Cardinal; l: Integer; begin l := Length(SubStr); Offset := 1; Result := 0; repeat Offset := PosEx(SubStr, Str, Offset); if Offset > 0 then begin Inc(Result); Inc(Offset, l); end; until Offset = 0; end; |
Re: Wie oft ist ein Zeichen in einem String
Zitat:
Delphi-Quellcode:
ich komme auf 203 ms...
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer; s: String; tick: Cardinal; begin setlength(s,100000); for i:=1 to 100000 do s[i]:=chr(i mod 10 +60); tick := GetTickCount; for I := 1 to 1000 do CountSubStr('A', s); label1.Caption := IntToStr(GetTickCount - Tick); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:43 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 by Thomas Breitkreuz