【问题标题】:How can I speed this up from being rather slow我怎样才能加快速度从相当慢
【发布时间】:2015-03-11 19:09:48
【问题描述】:

我在用于邮件项目的表单上使用了以下代码。 我有一个表单,可以使用其中一个字符串列表调用以添加更多联系人。这工作正常,但是当我从选择联系人“返回”并调用我的 SetupMail 时,需要很长时间才能使用新的联系人列表实际更新表单上的控件 当我使用写入文件的 FormatDateTime('dd/mm/yyyy hh:nn:ss:zzz', Now) 进行计时时,for 循环的每个步骤大约需要 1 毫秒

procedure TfrmMailPrepare.SetupMail;
var
  i: integer;
  MailTo: string;
  MailCc: string;
  MailBcc: string;
begin
  MailTo := '';
  MailCc := '';
  MailBcc := '';

  for i := 0 to fMailTo.Count - 1 do
    MailTo := MailTo + fMailTo.Strings[i] + '; ';
  txtMailTo.Text := MailTo;

  for i := 0 to fMailCc.Count - 1 do
    MailCc := MailCc + fMailCc.Strings[i] + '; ';
  txtMailCc.Text := MailCc;

  for i := 0 to fMailBcc.Count - 1 do
    MailBcc := MailBcc + fMailBcc.Strings[i] + '; ';
  txtMailBcc.Text := MailBcc;

  Refresh;
end;

【问题讨论】:

  • 请提供完整的计划、您的时间安排以及您期望达到的性能的一些指标。
  • 顺便说一句,您对 Refresh 的调用似乎很奇怪。看不出有这个需求。
  • 刷新调用是一个实验。
  • 这是一个典型的 SO 错误。始终发布原始代码,而不是您在尝试想法时破解的代码。
  • 代码的复杂性让我很难做一个完整的测试。我想要的只是让控件在分配给它后立即显示新值

标签: performance delphi tstringlist


【解决方案1】:

您正在执行大量的字符串连接,这意味着大量的内存(重新)分配。您可以使用TStrings.DelimiterTStrings.DelimitedText 属性大大简化此代码(及其开销),例如:

procedure TfrmMailPrepare.SetupMail;
begin
  fMailTo.Delimiter := ';';
  txtMailTo.Text := fMailTo.DelimitedText;

  fMailCc.Delimiter := ';';
  txtMailCc.Text := fMailCc.DelimitedText;

  fMailBcc.Delimiter := ';';
  txtMailBcc.Text := fMailBcc.DelimitedText;
end;

如果您需要每个分号后的空格(或 DelimitedText 包裹每个字符串的引号),您可以改用 TStrings.LineBreakTStrings.Text 属性:

procedure TfrmMailPrepare.SetupMail;
begin
  fMailTo.LineBreak := '; ';
  txtMailTo.Text := fMailTo.Text;

  fMailCc.LineBreak := '; ';
  txtMailCc.Text := fMailCc.Text;

  fMailBcc.LineBreak := '; ';
  txtMailBcc.Text := fMailBcc.Text;
end;

【讨论】:

  • 这些变体是否执行单一分配?我从来没有检查过。 Join 方法可能也值得一提。
  • @DavidHeffernan:是的,它们是单一分配操作。他们预先计算所需的大小,进行分配,然后将字符复制到分配的内存中。 TStringsTStringList 中没有 Join() 方法。也许您正在考虑 IJclStringList 中的 Join() 方法?
  • 通过助手在string中。
  • TStringHelper.Join() 不会接受 TStrings/TStringList 作为输入,因为它们没有实现 IEnumerator<string>IEnumerable<string> 接口。
  • 叹息。我希望 Embarcadero 现在已经学会了。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
相关资源
最近更新 更多