我需要对备忘录中的文本进行数学计算。[文件大小: ~2mb]
一个合适的示例是我需要解码的编码文本。
我将备忘录文本传递给字符串以对其进行解码。我想使用线程运行我的解码函数会更快。但是经过一番谷歌搜索,我没有找到一个适合我目的的好例子。
示例函数:
function entr_base_N(my_text:String):String;
var
ts_hamil64:Integer;
begin
For ts_hamil64 := 1 to Length(my_text) do
begin
Result:= Result + Chr(Ord(my_text[ts_hamil64])+10)
end;
end;
.....
.....
Memo1.Text:=entr_base_N(Memo1.Text)
我想将工作分成小块,平均划分作业,假设 3..8 个线程并将我的解码功能分配给这些线程。你能指导我吗?
处理文本文件的当前时间:~35 秒。感谢您的帮助。
不是问题。您的函数entr_base_N
立即运行。在调试器中尝试。你会发现它根本不需要时间。在现代计算机上处理 2MB 的字符串是微不足道的。也就是说,我总是建议在可能的情况下预先分配一个返回缓冲区。
所有时间都花在将生成的字符串发送回 memo 控件上。正在发生的事情是您正在将 #13 和 #10 字符转换为 #23 和 #20。无论出于何种原因,备忘录控件都不喜欢这样。 在我看来,您正在发回一个根本没有换行符的字符串,并且备忘录的换行代码表现不佳。
看到这一点的一种快速而肮脏的方法是将WordWrap
设置为False
备忘录。
这里的重要教训是,在尝试优化之前,您必须正确识别瓶颈。不过,这是一个很容易落入的陷阱,正如我最初为回答这个问题而做出的失败努力所证明的那样。
若要更快地对 Memo1.Text 进行作业,可以使用以下内容:
memo1.Perform(wm_setredraw, 0, 0);
try
memo1.Text:= entr_base_N(memo1.Text);
finally
memo1.Perform(wm_setredraw, 1, 0);
memo1.invalidate;
end;