Delphi:TTask似乎只是第一次慢

时间:2019-07-04 15:41:49

标签: delphi

在按钮上单击“我创建3个带有空过程的任务”,然后将与方法调用和完成的任务列表的时差写入控制台:

procedure TWinTest.BtnThreadTestClick(Sender: TObject);
var
  aTasks: array of ITask;
  aStart: Cardinal;
begin
  aStart := GetTickCount;

  Setlength(aTasks, 3);

  aTasks[0] := TTask.Create(procedure() begin

  end);
  aTasks[0].Start;

  aTasks[1] := TTask.Create(procedure() begin

  end);
  aTasks[1].Start;

  aTasks[2] := TTask.Create(procedure() begin

  end);
  aTasks[2].Start;

  TTask.WaitForAll(aTasks);


  Writeln( GetTickCount - aStart, 'ms');
end;

第一次通话耗时31毫秒,连续通话耗时0毫秒。

enter image description here

为什么第一个通话比连续通话慢?也许delphi会缓存该线程并在后续调用中重用它?

1 个答案:

答案 0 :(得分:4)

是的,默认情况下将任务线程缓存(在线程池中)。这被记录的行为:

Tutorial: Using Tasks from the Parallel Programming Library

  

本教程介绍了如何使用并行编程库(PPL)中的tasks实现应用程序。 Tasks是队列中的工作单元,在CPU时间可用时开始工作。 Tasks可以并行运行操作。 有一个主线程管理该队列,并从thread-pool分配线程来完成任务。 thread-pool的线程数取决于可用的CPU数量。

您可以通过创建TThreadPool对象并将其传递给TTask构造函数来自定义池的行为:

  

如果需要,还可以为Create提供一个参数TThreadPoolTTask的实例可以从中提取所需的线程资源。在不指定TThreadPool实例的情况下,资源是根据平台的CPU和线程功能从默认值中提取的。