TParallel.For()有一个名为AStride的参数。在我的情况下,AStride为2:

  TParallel.&For(2, 1, 10,
    procedure(index: Integer)
    begin
      TThread.Queue(nil,
        procedure
        begin
          memo1.Lines.Add(index.ToString());
        end
      );
    end
  );

我在这里无法理解“AStride”的技术含义。AStride = 2是否意味着第一个线程将处理[1..10]范围内的两个连续数字,第二个线程将处理下一个连续数字等?

**英语不是我的母语,我将“跨步”翻译为“长步”或“节奏”。

最佳答案

人们可能会以为可以在documentation中找到答案:



我读过这意味着循环变量值为1、3、5、7和9。但是事实并非如此。该程序:

{$APPTYPE CONSOLE}
uses
  System.Threading;

var
  Lock: TMonitor;
  LockObj: TObject;

procedure Proc(Index: Integer);
begin
  Lock.Enter(LockObj);
  Writeln(Index);
  Lock.Exit(LockObj);
end;

begin
  LockObj := TObject.Create;
  TParallel.&For(2, 1, 10, Proc);
end.

输出从110的十个数字。

实际上,使用stride参数可以调整性能。并行for循环使用线程池来安排工作。如果工作包很小,则线程池中的同步开销可能会影响性能。解决此问题的方法是确保工作包足够大以支配同步开销。

大步前进可以实现这一目标。在您的示例中,循环索引值1和2是一项工作。索引值3和4是另一项工作。等等。通过将多个索引分组到单个工作中,可以减少花费在同步开销上的时间。

10-04 14:15