Entwickler-Ecke

Sonstiges (Delphi) - Wortwürfler


trm - Sa 21.07.12 22:47
Titel: Wortwürfler
Huhu. Ich weiß leider nicht, wonach ich suchen muss, damit ich meine Frage finde.

Anbei ein kleines Testprogramm, mit dem Stringkombinationen aus den verfügbaren Zeichen erzeugt werden.

Mein Prblem: viel zu langsam bei der Ausführung (4 Zeichen dauern schon extrem lange bei meinem DualCore).

Geht das in einer Art schneller, ohne, dass doppelte Worte vorkommen ?


jaenicke - So 22.07.12 00:12

Dass das so lange dauert, liegt daran, dass du die Ergebnisse direkt in das Memo schreibst. Das dauert eben.
Wenn du die stattdessen in eine Stringvariable schreibst und erst am Ende ins Memo, geht es deutlich schneller. ;-)


trm - So 22.07.12 01:02

Hm. Sowas vergesse ich immer wieder :(


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:
  procedure P(var A: string; B: string);
  var
    J: Word;
    C, D: string;
    sl:TStringList;
  begin
  sl:=TStringList.Create;
    { P(N,N) >>  R=Slen  }
    if Length(B) = SLen - R then
    begin
      sl.Add(A); {Per++}
      Inc(x);
    end
    else
      for J := 1 to Length(B) do
      begin
        C := B;
        D := A + C[J];
        Delete(C, J, 1);
        P(D, C);
      end;
      memo1.Lines.AddStrings(sl);
      sl.Free;
  end;


Ist nun Dank der Stringlist erheblich schneller. Aber wenn ich mir andere Programme anschaue, die so etwas machen (sogar php-scripte), weiss ich nicht, wie das geht.

Würde es etwas nützen, wenn man Speicher vorbelegt?


Nano-Ware - So 22.07.12 10:59

Hey,
du könntest auch das Einlesen in die Stringlist in einem zweiten Thread erledigen und dann im Hauptthread die Memo-Ausgabe mit der StringList synchronisieren


jaenicke - So 22.07.12 13:54

Am schnellsten wäre es eine VirtualTreeView zu nehmen und die Werte gar nicht erst in der visuellen Komponente vorzuhalten. Dann reicht ein vorher auf die richtige Größe gebrachtes Array mit den Einträgen aus, das dann als Wertespeicher benutzt wird, bereits aus und du musst nur die entsprechende Anzahl Einträge in der TreeView erzeugen und in OnGetText die Strings aus dem Array holen.


trm - So 22.07.12 14:45

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

Wird das nicht auch über eine TStringList schon in einer nicht-Visuellen Komponente gemacht mit meiner letzten Änderung?


jaenicke - So 22.07.12 20:58

Nein, du kopierst den Text ja dennoch komplett in die visuelle Komponente, obwohl nur ein Teil davon angezeigt wird.