Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#2

Re: Wortliste erstellen: Zählroutine zu langsam

  Alt 10. Mai 2010, 18:41
a) In einer sortierten Liste wird ein schnellerer Algorithmus zum Suchen verwendet.
b) Das Object-Property kann man schön für einen Integer verwenden, anstatt hier ständig die Strings/Zeilen für den Value-Zugriff zerlegen zu müssen. (Value und Name wird in nur einem String verwaltet und bei solchen Zugriffen jedesmal erneut zerlegt und zusammengesetzt)
c) Und wenn die Anzahl nicht mehr als String gehalten wird, kann man sich auch noch die ganzen Integer<>String-Umwandlungen sparen.
d) Var und Const ist bei Objeten nicht nötig ... es sei denn man will wirklich den Instantzeiger verändern und nicht nur den Inhalt

Delphi-Quellcode:
Procedure ZaehleAlleWoerterDerListe(TokenListe, TokenListeKorpus: TStringList);
var
  i, i2: Integer;
  token: String;
begin
  for i := 0 to TokenListe.Count - 1 do
  begin
    token := GibMirToken(TokenListe[i], #9);
    i2 := TokenListeKorpus.IndexOf(Token);
    if i2 <= 0 then
      TokenListeKorpus.AddObject(token, TObject(1))
    else
      TokenListeKorpus.Objects[i2] := TObject(Integer(TokenListeKorpus.Objects[i2]) + 1);
  end;
end;
und in neueren Delphiversionen ginge auch sowas:
Delphi-Quellcode:
Procedure ZaehleAlleWoerterDerListe(TokenListe, TokenListeKorpus: TStringList);
var
  i: Integer;
  S, Token: String;
begin
  for S in TokenListe do
  begin
    token := GibMirToken(S, #9);
    i := TokenListeKorpus.IndexOf(Token);
    if i <= 0 then
      TokenListeKorpus.AddObject(token, TObject(1))
    else
      TokenListeKorpus.Objects[i] := TObject(Integer(TokenListeKorpus.Objects[i]) + 1);
  end;
end;
Die Tockenliste sollte natürlich entsprechend erstellt werden, damit sie auch optimal genutzt werden kann
Delphi-Quellcode:
TokenListeKorpus := TStringList.Create;
TokenListeKorpus.Sorted := True;
TokenListeKorpus.Duplicates := dupIgnore;
Integer(TokenListeKorpus.Objects[i]) enthält dann also die Anzahl zu dem Token mit dem Namen TokenListeKorpus[i] .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat