Ответ 1
Можно подумать, что ответ можно найти в документации :
AStride: Целое число, которое представляет приращение итерации цикла.
Я бы прочитал это как подразумевающее, что значения переменной цикла равны 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.
выводит десять чисел от 1
до 10
.
Фактически параметр шага позволяет вам настроить производительность. Параллельный цикл использует пул потоков для планирования работы. Если рабочие пакеты очень малы, тогда служебные данные синхронизации в пуле потоков могут доминировать над производительностью. Способ обойти это - убедиться, что рабочие пакеты достаточно велики, чтобы доминировать накладные расходы синхронизации.
Этот шаг позволяет достичь этого. В вашем примере значения индекса цикла 1 и 2 выполняются как одна часть работы. Значения индексов 3 и 4 - это еще одна работа. И так далее. Сгруппировав несколько индексов в одну часть работы, количество времени, затрачиваемого на накладные расходы синхронизации, уменьшается.