Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie oft ist ein Zeichen in einem String (https://www.delphipraxis.net/85075-wie-oft-ist-ein-zeichen-einem-string.html)

cruiser 25. Jan 2007 16:06

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?" ;)

xZise 25. Jan 2007 16:09

Re: Wie oft ist ein Zeichen in einem String
 
Zitat:

Zitat von Nils_13
Wo gab es den schonmal ? Vlt. in einem anderen Thread, aber ich habe doch schneller gepostet :P

Ich bezog es auf den 1. Code ;) Das er schonmal, von dir, gepostet wurde ^^

dominikkv 25. Jan 2007 16:12

Re: Wie oft ist ein Zeichen in einem String
 
[quote="xZise"]
Zitat:

Zitat von dominikkv
Gabs schonmal:

das sah vor 2 minuten noch anders aus :wink:

Zitat:

Zitat von Muetze1
Da würde ich glatt mal frech fragen: wer hat die schnellste?

Delphi-Quellcode:
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;
-> 7 sekunden

Matze 25. Jan 2007 16:17

Re: Wie oft ist ein Zeichen in einem String
 
Wenn du eine Geschwindigkeitsmessung durchführen willst, kannst du TTime eigentlich vergessen. Nimm lieber Delphi-Referenz durchsuchenGetTickCount.

xZise 25. Jan 2007 16:21

Re: Wie oft ist ein Zeichen in einem String
 
Zitat:

Zitat von Matze
Wenn du eine Geschwindigkeitsmessung durchführen willst, kannst du TTime eigentlich vergessen. Nimm lieber Delphi-Referenz durchsuchenGetTickCount.

Oder noch besser: GetThreadTimes ^^

Tut über Threads... Und dabei ist eine Zeitberechnung ;)

shmia 25. Jan 2007 16:21

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:
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
Kopiert aus der JCL. :angel2:

SirThornberry 25. Jan 2007 16:22

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

sirius 25. Jan 2007 16:32

Re: Wie oft ist ein Zeichen in einem String
 
Delphi-Quellcode:
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;
Sieger ist "Zeichen" mit etwa 140ms
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)

cruiser 25. Jan 2007 17:25

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;

dominikkv 25. Jan 2007 17:52

Re: Wie oft ist ein Zeichen in einem String
 
Zitat:

Zitat von cruiser
Und dass ich den uralten Code wirklich langsam mal optimieren muss ;)

Edit: Okay.. ich fordere ein neues Rennen :lol:

hehe...
Delphi-Quellcode:
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;
ich komme auf 203 ms...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:32 Uhr.
Seite 2 von 3     12 3      

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