我的 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
只会禁止OnChanging
and OnChanged
事件。它对内容本身更改的内部处理没有影响。
TMemo.Lines
是由TMemoStrings
它将文本内容存储在 Window 控件本身中。因此BeginUpdate/EndUpdate
在这里毫无用处。
使用本地可能会获得更好的结果TStringList
实例,并使用Text
从中复制数据的属性TMemo
to 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;
Note:一些评论提到使用Assign
而不是Text
从备忘录复制内容或将内容复制到备忘录时的属性:Assign
由于内部优化,在这种情况下速度明显变慢Text
财产为TMemoLines
。该属性的 Getter 和 Setter 通过单个 WM_GETTEXT/WM_SETTEXT 消息直接访问 Windows 控件,而Assign
每行使用一个 EM_GETLINE 消息进行读取,每行使用一系列 EM_LINEINDEX、EM_SETSEL、EM_LINELENGTH 和 EM_REPLACESEL 进行写入。一个简单的时序测试表明,上面的代码在替换时大约需要 600 msText
作业与Assign
通话需要11秒以上!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)