- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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
和OnChanged
事件。它对内容本身更改的内部处理没有影响。
TMemo.Lines
由 TMemoStrings
实现它将文本内容存储在 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/
很抱歉新手的问题,但是: 我最近才发现“=”运算符不只是处理对象/等等。值(value),也是引用。这很酷,但我认为这对变量来说是不一样的,它不会在存储整数或 float 的变量之间创建引用。后来我觉
我是一名优秀的程序员,十分优秀!