Я создал пример программы для проверки выполнения задач параллельно с учетом количества задач, выполняемых параллельно.
Несколько предположений:
Операция в потоке не зависит от другого потока, поэтому механизмы синхронизации между потоками не важны.
Идея состоит в том, чтобы проверить, насколько эффективно:
1. Создайте как можно больше заданий
или же
2. Ограничьте число параллельных задач и дождитесь завершения некоторых задач, прежде чем создавать оставшиеся задачи.
Следующая программа:
static void Main(string[] args)
{
System.IO.StreamWriter writer = new System.IO.StreamWriter("C:\\TimeLogV2.csv");
SemaphoreSlim availableSlots;
for (int slots = 10; slots <= 20000; slots += 10)
{
availableSlots = new SemaphoreSlim(slots, slots);
int maxTasks;
CountdownEvent countDownEvent;
Stopwatch watch = new Stopwatch();
watch.Start();
maxTasks = 20000;
countDownEvent = new CountdownEvent(maxTasks);
for (int i = 0; i < maxTasks; i++)
{
Console.WriteLine(i);
Task task = new Task(() => Thread.Sleep(50));
task.ContinueWith((t) =>
{
availableSlots.Release();
countDownEvent.Signal();
}
);
availableSlots.Wait();
task.Start();
}
countDownEvent.Wait();
watch.Stop();
writer.WriteLine("{0},{1}", slots, watch.ElapsedMilliseconds);
Console.WriteLine("{0}:{1}", slots, watch.ElapsedMilliseconds);
}
writer.Flush();
writer.Close();
}
Вот результаты:
По оси Y берется время в миллисекундах, по оси X - количество слотов семафоров (см. Вышеприведенную программу)
По сути, тенденция такова: чем больше параллельных задач, тем лучше. Теперь мой вопрос в каких условиях: 1015 *
Большее количество параллельных задач = менее оптимальное (затраченное время)?
Я полагаю, одно условие:
Задачи являются взаимозависимыми, и, возможно, придется ждать, пока определенные ресурсы будут доступны.
Ограничивали ли вы в каком-либо сценарии количество параллельных задач?