delphi - 处理大量行时,TMemo 速度慢得令人痛苦

标签 delphi delphi-xe7

我的 TMemo 中有 100000 行。我想做一些类似的事情:

 for i:= 0 to Memo.Lines.Count-1 do
  Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);

但是速度是每秒0.5行!!

添加 BeginUpdate/EndUpdate 后,我没有看到任何速度提升。

 Memo.Lines.BeginUpdate;
 for i:= 0 to Memo.Lines.Count-1 do
  Memo.Lines[i]:= SomeTrim(Memo.Lines[i]);
 Memo.Lines.EndUpdate;

我的问题是为什么 BeginUpdate/EndUpdate 没有帮助?

最佳答案

TStrings.BeginUpdate/EndUpdate只会禁止OnChangingOnChanged事件。它对内容本身更改的内部处理没有影响。

TMemo.LinesTMemoStrings 实现它将文本内容存储在 Window 控件本身中。因此BeginUpdate/EndUpdate在这里毫无用处。

使用本地 TStringList 可能会获得更好的结果实例,并使用Text属性从 TMemo 复制数据至TStringList然后回来。 Text属性是访问 TMemo 的全部内容的最有效方法。立刻。

  lst := TStringList.Create;
  try
    lst.Text := Memo1.Lines.Text;
    for I := 0 to lst.Count - 1 do begin
      lst[I] := SomeTrim(lst[I]);
    end;
    Memo1.Lines.Text := lst.Text;
  finally
    lst.Free;
  end;

注意:一些评论提到使用 Assign而不是 Text将内容复制到备忘录时的属性:Assign由于 Text 的内部优化,在这种情况下速度明显变慢属性 TMemoLines 。此属性的 Getter 和 Setter 通过单个 WM_GETTEXT/WM_SETTEXT 消息直接访问 Windows 控件,而 Assign每行使用一个 EM_GETLINE 消息进行读取,每行使用一系列 EM_LINEINDEX、EM_SETSEL、EM_LINELENGTH 和 EM_REPLACESEL 进行写入。简单的时序测试表明,上述代码在替换 Text 时大约需要 600 ms。 Assign 的作业调用需要超过11秒!

关于delphi - 处理大量行时,TMemo 速度慢得令人痛苦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46990961/

相关文章:

delphi - TDirectory.Delete 似乎是异步的

delphi - TScaledLayout 和自定义样式的绘画问题

delphi - Windows 10 中的 MDI 窗口标题

delphi - 我需要将 "inherited"行添加到记录构造函数中吗?

delphi - TPipeServer 和 TPipeClient 组件的读/写示例代码和安全检查

delphi - char 数组的 D2009 问题 - 我如何 `elegantly` 修复我的代码?

delphi - 为什么 Delphi 没有在正确的文件夹中输出 DCU 文件?

delphi - 如何更改 TreeView 节点高度,在节点中绘制 3 条线

delphi - 如何将 IEnumerable 的 IEnumerable 折叠为单个 IEnumerable?

mysql - Delphi 和 Web 应用程序之间的行尾问题