Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
156 Beiträge
 
Delphi 12 Athens
 
#1

Desaströse Performance von TRichedit

  Alt 11. Sep 2024, 15:03
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
Miniaturansicht angehängter Grafiken
memo-export.jpg   richeditexport.jpg  
  Mit Zitat antworten Zitat