Wie es scheint, ist die ohnehin noch nie berauschende Performance des TRichedit-Controls ist seit Delhpi 11 geradezu ins bodenlose gesackt. Bei Tests mit meiner 'Referenz-Funktion' mit der eine relativ große Stringlist (90000 - 174000 Zeilen) in einem Richedit angezeigt wird, zeigte sich eine geradezu groteske Ausführungszeit von bis zu 16(!) sec. (siehe Anhang).
Delphi-Quellcode:
// stopwatch: System.Diagnostics.TStopwatch
Procedure StartStopWatch;
begin
Stopwatch.Reset;
Stopwatch.Start;
end;
Function Stoptime:double;
begin
Stopwatch.stop;
result:= Stopwatch.ElapsedMilliseconds / MSecsPerSec / SecsPerDay;
end;
procedure TGL4Mainform.XMLContent1Click(Sender: TObject);
var stop: double;
SL:TStringlist;
FN: string;
begin
FN:= 'filename.txt';
SL:= TStringlist.Create;
try
If GetXMLContent(SL) Then
begin
SL.SaveToFile(FN,TEncoding.unicode);
startstopwatch;
richedit1.Text:= SL.Text;
//richedit1.lines.LoadFromFile(fn);
stop:= stoptime;
richedit1.setfocus;
richedit1.Lines.Add(#13#10'Anzeige der Daten im Richedit: ' + timestring(-stop));
richedit1.Lines.Add(#13#10'Anzahl der Zeilen: ' + richedit1.Lines.Count.ToString);
end;
finally
SL.Free;
end;
end;
Mit einer mit Delphi 10.4.2 compilierten Version meines Programms dauert das ganze weniger als 2 Sekunden. Auf einem weniger betagten Rechner dürfte natürlich alles noch deutlich schneller gehen, aber bemerkenswert ist vor allem das Verhältnis. Das
'neue' TRichedit-Steuerelement ist demnach bis zu 8mal langsamer als das alte, und das gerade bei der kleineren
XML. Die stammt allerdings von einem Mac und enthält z.T. alternative, aber gültige utf-8 Codierungen.
Wenn ich anstelle des TRichedit ein TMemo verwende, dauert derselbe Vorgang übrigens weniger als 100 ms (s. Anhang).
Delphi-Quellcode:
procedure TGL4Mainform.XMLContent2Click(Sender: TObject);
var stop: double;
SL:TStringlist;
FN: string;
const mask = 'content';
begin
setmaincursor(crHourGlass);
FN:= 'filename.txt';
SL:= TStringlist.Create;
try
If GetXMLContent(SL) Then
begin
SL.SaveToFile(FN,TEncoding.unicode);
startstopwatch;
memo1.Text:= SL.Text;
stop:= stoptime;
memo1.setfocus;
Memo1.Lines.Add(#13#10'Anzeige der Daten im Memo: ' + timestring(-stop));
Memo1.Lines.Add(#13#10'Anzahl der Zeilen: ' + memo1.Lines.Count.ToString);
end;
SetMainCursor(crDefault);
finally
SL.Free;
end;
end;
Aber einige optische Gimmicks wie mehrfarbiger Text sind eben mit einem TMemo nicht zu realisieren. Auch TListbox fällt als Alternative aus, da es mit so großen Listen offenbar nicht umgehen kann.
Als Workaround hatte ich die Stringlist in einer Datei zwischengespeichert und anschließend in das Richedit geladen. Das dauert zwar nur gut 2 sec, aber leider werden dann nicht alle Sonderzeichen korrekt dargestellt. Eine Speicherung als utf-8 (TEncoding.UTF8) schlägt fehl ('Keine Zuordnung für
Unicode-Zeichen in der Multibyte-Zielcodeseite vorhanden'), und bei Speicherung als '
Unicode' (TEncoding.Unicode) dauert der Ladevorgang ebenfalls >15 sec, dafür ist das Ergebnis wenigstens korrekt.
Also eine absolut unbefiedigende Situation. Oder gibt's noch irgendeine Stellschraube bei TRichedit, die ich bisher übersehen habe? Oder einen brauchbaren Workaround?
Gruß LP