Hallo,
jaenicke hat vollkommen recht.Eine Stringliste ist erheblich schneller.
Hier mal ein Beispiel mit Button1 und Memo1 mit 1 Mio Zeilen mit Lazarus, deshalb {$R *.lfm} statt {$R *.dfm}.
Mit Memo1.lines dauert es insgesamt 31 Sekunden mit der Stringliste 1.56 Sekunden ( die Stringerzeugung in DoSomething dauert auch ohne einfügen in die Stringliste 1.46 Sekunden, das anhängen von '</BR>' nur 0.09 Sekunden ) und dass anschliessende einfügen auf Memo1 1,09 Sekunden, was aber zum schreiben in eine Datei nicht nötig ist.
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117:
| type
TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private const cMax = 20; var n_max : NativeInt; m_max,gesCount :NativeInt; dummyTxt : String; combination: array [0..cMax] of byte; MeineListe : TStringlist;
procedure DoSomething; procedure generate(m, n: NativeInt); public end;
var Form1: TForm1;
implementation {$IFDEF FPC} {$R *.lfm} {$ELSE} {$R *.dfm} {$ENDIF}
procedure TForm1.DoSomething; var i : NativeInt; s : String; Begin inc(gesCount);
s := ''; for i := 1 to m_max do begin str(combination[i]:3,dummyTxt); s := s+dummyTxt; end;
MeineListe.Add(s);
end;
procedure TForm1.generate(m,n: NativeInt); begin IF m = m_max then For n := n to n_max do Begin combination[m] := n; DoSomething; end else For n := n to n_max do Begin combination[m] := n; generate(m+1,n+1); end; end;
procedure TForm1.Button1Click(Sender: TObject); var T1,T0: TDateTime; i : NativeInt;
begin Memo1.lines.clear; Memo1.lines.BeginUpdate; T0:= now; n_max := cMax; MeineListe:= TStringlist.create; MeineListe.Capacity:= 1 shl cMax -1; Memo1.lines.Capacity:= 1 shl cMax -1; For i := 1 to cMax do Begin m_Max:= i; generate(1,1); end; T1:= now;
Memo1.Lines.Add(Format(' MeineListe.Count %d',[MeineListe.Count])); Memo1.Lines.Add(Format(' Laufzeit %f',[(T1-T0)*86400])); T0:= now; For i := MeineListe.Count-1 downto 0 do MeineListe[i]:= MeineListe[i]+'</BR>'; T1:= now; Memo1.Lines.Add(Format(' Laufzeit anfuegen %f',[(T1-T0)*86400])); Memo1.Lines.addstrings(MeineListe); T0:= now; Memo1.Lines.Add(Format(' Laufzeit einfuegen %f',[(T0-T1)*86400]));
Memo1.lines.EndUpdate; MeineListe.free; end;
end. |
Gruß Horst