FMX TMemo 非常缓慢

Posted

技术标签:

【中文标题】FMX TMemo 非常缓慢【英文标题】:FMX TMemo is painfully slow 【发布时间】:2021-11-11 09:00:50 【问题描述】:

我正在编写一个 Firemonkey 应用程序并遇到了一个问题:TMemo 非常缓慢。加载 3 mb 文件需要 12+ 秒,VCL TMemo 只需要 400 毫秒

这是我的测试代码:

uses
    System.Threading, System.Diagnostics;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TTask.Run(
    procedure
    begin
      Sleep(100);
      var stopwatch := TStopwatch.Create;

      TThread.Synchronize(nil,
        procedure
        begin
          stopwatch.Start;
          Memo1.Lines.LoadFromFile('../../../DemoData.json');
        end);

      TThread.Synchronize(nil,
        procedure
        begin
          stopwatch.Stop;
          Caption := stopwatch.ElapsedMilliseconds.ToString;
        end)
    end);
end;

整个测试项目(包括 JSON 文件)可以在这里找到: https://borrisholt.dk/Delphi/MemoDemo.zip

或者您当然可以使用自己的 3mb 文本文件。

有什么可以做的吗?还是就像 FMX 一样?

【问题讨论】:

您是否尝试过将文件加载到后台线程中的 TStringList 中,然后将其传输到您的 TMemo? 我现在有:同样的结果。我期待的是,因为 LoadFromFile 使用 8 秒。 加载代码周围的BeginUpdate/EndUpdate怎么样? 也试过了,没什么区别。 您必须自己编写。您可以重用大量现有代码。支持 Lines 属性的 TStringList 非常愚蠢,并且分配给它会以相当低效的方式创建副本。您需要的是能够在不创建副本的情况下将 Lines 引用替换为另一个引用 - 换句话说,将数据容器与呈现它的控件分开。这样您就可以在后台线程中加载数据并在主线程中交换引用将只是简单的指针分配和重新绘制控件。 【参考方案1】:
Memo1.ControlType:=Platform;

如果你这样做,你可以在vcl中获得性能。

【讨论】:

以上是关于FMX TMemo 非常缓慢的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Firebase 功能部署非常缓慢?

几页深后,页面转换变得非常缓慢

非常简单的 MySQL 索引查询运行非常缓慢

CS5 隐藏层非常缓慢

ListView 控件加载非常缓慢

Postgresql 通过网络非常缓慢地发送查询结果