Parallel.For需要比循环

时间:2018-03-25 16:19:51

标签: for-loop omnithreadlibrary

在Delphi Berlin 10.1中,我有一个for循环:

for i := 0 to slSMP.Count - 1 do
begin
  if System.StrUtils.Containstext(slSMP.ValueFromIndex[i], ThisSearchTerm) or
    System.StrUtils.Containstext(ExtractFileName(ExcludeTrailingPathDelimiter(slSMP.Names[i])), ThisSearchTerm) then
  begin
    slTempSearchList.Add(slSMP.Names[i] + slSMP.ValueFromIndex[i]);
  end;
end;

slSMP slTempSearchList 显然属于TStringList类型。

不幸的是,这个循环花费了太多时间,所以我决定将它转换为OtlParallel.Parallel.For循环:

OtlParallel.Parallel.For(0, slSMP.Count - 1).Execute(
  procedure (i: integer)
  begin
    if System.StrUtils.Containstext(slSMP.ValueFromIndex[i], ThisSearchTerm) or
      System.StrUtils.Containstext(ExtractFileName(ExcludeTrailingPathDelimiter(slSMP.Names[i])), ThisSearchTerm) then
    begin
      slTempSearchList.Add(slSMP.Names[i] + slSMP.ValueFromIndex[i]);
      //CodeSite.Send('TformSearchStartMenu.DoSearchFromSearchEdit: i', i);
    end;
  end);

明显地,当CodeSite.Send行被停用时,此循环永远不会完成,因此我必须使用任务管理器关闭应用程序。

但是当CodeSite.Send行被激活时,循环结束,但它比简单的for循环需要更长的时间。

那么如何通过并行编程更快地完成这个循环呢? 为什么OtlParallel.Parallel.For仅在CodeSite.Send行被激活时才有效?如何在没有CodeSite.Send行的情况下使其工作?

0 个答案:

没有答案