В LINQ запроса, я использовал .AsParallel следующим образом:Увеличение времени, затраченного для запуска LINQ .asparallel запроса при создании новых отдельных задач в C#
var completeReservationItems = from rBase in reservation.AsParallel()
join rRel in relationship.AsParallel() on rBase.GroupCode equals rRel.SourceGroupCode
join rTarget in reservation.AsParallel() on rRel.TargetCode equals rTarget.GroupCode
where rRel.ProgramCode == programCode && rBase.StartDate <= rTarget.StartDate && rBase.EndDate >= rTarget.EndDate
select new Object
{
//Initialize based on the query
};
Затем я создал две отдельные задачи и был запуская их параллельно, проходя одни и те же списки для обоих методов следующим образом:
Task getS1Status = Task.Factory.StartNew(
() =>
{
RunLinqQuery(params);
});
Task getS2Status = Task.Factory.StartNew(
() =>
{
RunLinqQuery(params);
});
Task.WaitAll(getS1Status, getS2Status);
Я захватывала тайминги и был удивлен, увидев, что тайминги были следующими:
- Выше сценарий: 6 сек (6000 мс)
- и тот же код, работающий последовательно вместо 2 Задачи: 50 мс
- и тот же код, но без .AsParallel() в LINQ: 50 мс
Я хотел понять, почему это происходит так долго в вышеупомянутом сценарии.
Потому что параллель не означает быстрее.Если базовая операция выполняется быстро, с парралелизмом она будет работать медленнее, потому что переключение контекста между потоками занимает слишком много времени. – tym32167
@ tym32167 Согласен, но я хотел знать, каким образом потоки будут созданы в этом сценарии. Потому что в сценариях 2 и 3, о которых я упомянул, он все равно будет параллельной операцией, но быстрее. –