我有100000行的TMemo。我想做这样的事情:
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没有帮助?
2条答案
按热度按时间ogsagwnx1#
TStrings.BeginUpdate/EndUpdate
只会禁止OnChanging
和OnChanged
事件,对内容本身变更的内部行程没有影响。TMemo.Lines
是由TMemoStrings
实现的,它将文本内容存储在Window控件本身中。因此BeginUpdate/EndUpdate
在这里非常无用。通过使用本地
TStringList
示例,并使用Text
属性将数据从TMemo
复制到TStringList
,然后再复制回来,可能会获得更好的结果。Text
属性是一次访问TMemo
的整个内容的最有效方法。**注意:**一些注解提到在从备忘录复制内容或将内容复制到备忘录时使用
Assign
而不是Text
属性:在这种情况下,Assign
的速度明显较慢,这是因为TMemoLines
的Text
属性进行了内部优化。此属性的Getter和Setter使用单个WM_GETTEXT/WM_SETTEXT消息直接访问Windows控件,而Assign
使用每行一条EM_GETLINE消息进行阅读,并使用一系列EM_LINEINDEX、EM_SETSEL一个简单的计时测试表明,上面的代码大约需要600毫秒,而用Assign
调用替换Text
赋值需要11秒以上!ru9i0ody2#
试验和结果:
所以,乌维是对的。